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.
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
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.