Angenommen, ich habe eine Klasse, die über eine constexpr
-Funktion einen konstanten Ausdruck zurückgeben kann:
Wenn ich constexpr Werte von Foo::Bar()
initialisieren wollte, wie sollte ich einen Parameter vom Typ Foo
übergeben? Ich habe versucht, diese beiden, mit einem Beispiel constexpr
Variable innerhalb von jedem zu testen, dass es initialisiert werden kann:
Aber kling 3.7 löst einen Fehler bei ByReference
aus, während gcc & gt; = 5.1 nicht: Live-Demo
Was ist der Unterschied zwischen einem const Foo &
oder einem einfachen Foo
, wenn Bar
gleich constexpr
ist und einen gültigen konstanten Ausdruck zurückgibt?
Was ist richtig und warum, GCC oder Clang? Falls verfügbar, sind Verweise auf den Standard wünschenswert.
§5.20:
Die Referenz hat jedoch aus der Sicht von i
keine vorangehende Initialisierung: Es ist ein Parameter. Es wird initialisiert sobald ByReference
aufgerufen wird.
Entfernen wir die constexpr
aus i
's Deklaration und betrachten einen Aufruf von ByReference
in seiner Gesamtheit:
Das ist in Ordnung, da f
der Initialisierung vorausgeht. Der Initialisierer von f
ist ebenfalls ein konstanter Ausdruck, da der implizit deklarierte Standardkonstruktor in diesem Fall constexpr
ist (§12.1 / 5).
Daher wird i
durch einen konstanten Ausdruck initialisiert und der Aufruf ist selbst ein konstanter Ausdruck.