Überraschendes Verhalten des Literaltyps zur Laufzeit

8

Ich bin etwas perplex über das Verhalten dieses Codes, der mit clang 3.9 kompiliert wurde:

%Vor%

Godbolt-Link: Ссылка

Statische / Kompilierzeit-Auswertung läuft für fooA ; Zur Laufzeit scheint der Konstruktor jedoch vollständig weggelassen zu sein. Der static_assert wird nicht ausgelöst (wie erwartet), aber main gibt immer noch 0 zurück. Ist das, weil A ein Literaltyp ist oder liegt es an einem Compilerfehler?

Im Falle des ersteren wären alle Verweise auf den Standard zu begrüßen.

    
Oleg Bogdanov 02.03.2017, 21:57
quelle

2 Antworten

-2

Das Problem besteht darin, dass die Ausgabe davon abhängt, ob die Kopie Elision ausgeführt wird oder nicht (wenn nicht, wird self auf eine temporäre initialisiert, so dass fooA() nicht const und seine Deklaration schlecht formatiert wird, dann erhalten Sie das unerwartete Verhalten In dem Standard gibt es keine starke Anforderung der Kopie Elision in diesem Zusammenhang (für C ++ 14), so erhalten Sie unterschiedliche Verhaltensweisen von verschiedenen Compilern.Sie können mehr Details zu diesem Problem in diesem Bericht

    
dlavila 03.03.2017, 20:59
quelle
2

Hier ist ein noch reduzierteres Beispiel:

%Vor%

Weder gcc noch clang akzeptieren diesen Code, da sie die Verwendung von this im Initialisierer nicht mögen. % Co_de% ist jedoch in einem konstanten Ausdruck erlaubt, solange es sich in einem this -Konstruktor befindet, da N3652 . MSVC macht das richtig.

    
Barry 02.03.2017 22:30
quelle

Tags und Links