2017-01-30 3 views
3

Wie der Titel fragt: Kann sichergestellt werden, dass eine constexpr-Funktion höchstens einmal zur Kompilierzeit aufgerufen wird?Kann sichergestellt werden, dass eine constexpr-Funktion höchstens einmal zur Kompilierzeit aufgerufen wird?

Dies wird nicht eindeutig möglich, wenn die Funktion constepxr nicht; Ich könnte eine Funktion schreiben, die immer dann aufgerufen wird, wenn ich die Leertaste drücke, damit der Compiler das zur Kompilierungszeit nie herausfinden kann.

+2

constexpr Ausdrücke/Funktionen haben Nebenwirkungen nicht, spielt es keine Rolle, so nicht, wie oft sie (mit Ausnahme der Laufzeit/Performance) bezeichnet werden. Warum also wollen Sie sicherstellen, dass ein consExpr nur einmal ausgewertet wird? –

+0

@WernerHenze "Warum willst du also sicherstellen, dass ein Constexpr nur einmal ausgewertet wird?" nur Neugierde und die Grenzen einer Sprache zu finden :-) – rwols

+0

@rwols: Das Problem ist, dass "nur einmal aufgerufen" ein sinnloses Konzept für eine "constexpr" -Funktion zur Kompilierzeit ist. Es kann buchstäblich eineinhalb Mal aufgerufen werden (!) - Implementierungen können die Auswertung von constexpr-Ausdrücken zwischenspeichern, und dies kann partielles Caching beinhalten. – MSalters

Antwort

10

Kurze Antwort: Nein, weil constexpr Funktionen externen Status nicht lesen/einstellen können. (Sie können internen Status haben, aber sie müssen immer noch "rein" sein).


wirkliche Antwort: wahrscheinlich ja, aber es ist eine schlechte Idee. Es gibt eine Reihe von Blog-Beiträge von Filip Roséen, die die Umsetzung von Stateful constexpr Funktionen deckt durch Missbrauch friend Schiff und ADL:

Die Technik ist sehr geheimnisvoll und kompliziert. Es gilt als Missbrauch von Features durch CWG, which is trying to make it ill-formed with issue #2118.

+2

Diese drei Artikel gut zu lesen sind , also +1 von mir! Sie haben wahrscheinlich recht, dass niemand diese Techniken jemals anwenden sollte. – rwols

+0

Die (VERY SHOUTY) Links sind tot –

+0

@underscore_d: Danke, hoffentlich sind sie bald wieder da. Google-Cache-Link hinzugefügt –

Verwandte Themen