C ++ 14: Initialisierung von consExpr-Variablen aus Parameterwerten

8

Angenommen, ich habe eine Klasse, die über eine constexpr -Funktion einen konstanten Ausdruck zurückgeben kann:

%Vor%

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:

%Vor%

Aber kling 3.7 löst einen Fehler bei ByReference aus, während gcc & gt; = 5.1 nicht: Live-Demo

%Vor%

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.

    
Xo Wang 30.07.2015, 03:35
quelle

1 Antwort

5

§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:

%Vor%

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.

    
Columbo 30.07.2015, 09:44
quelle

Tags und Links