2016-06-19 11 views
36

Der folgende Code kompiliert mit GCC fein:GCC akzeptiert `Constexpr struct {} s;` aber Clang lehnt es ab. Wer hat Recht?

constexpr struct {} s; 

Aber Clang lehnt es mit dem folgenden Fehler:

error: default initialization of an object of const type 'const struct (anonymous struct at …)' without a user-provided default constructor

ich getestet habe alle Versionen von GCC und Clang, die ich in der Lage war zu finden https://gcc.godbolt.org/. Jede Version von GCC akzeptiert den Code und jede Version von Clang weist ihn zurück.

Ich frage mich, welche Compiler in diesem Fall korrekt ist?
Was sagt der Standard dazu?

+4

Versuchen Sie clang-3,9? –

+5

[CWG253] (http://wg21.link/CWG253). –

+1

@ T.C. http://stackoverflow.com/questions/29683381/const-t-works-const-t-fails-when-t-is-a-non-pod#comment47503814_29683381 – Columbo

Antwort

35

Clang befolgt die folgende Passage in [dcl.init]/7:

If a program calls for the default initialization of an object of a const-qualified type T , T shall be a class type with a user-provided default constructor.

Diese Formulierung ist defective und hence ignored by GCC (und, wie von v3.9, auch durch Clang).
Das obige Zitat unterscheidet sich von Kernfrage 253 der aufgrund N2762 Bewegt-/Anpassung Ziffer 9 wie zitiert.

+4

Wortlaut ignoriert auch von VC++ 2015 – Ajay