Update: Il codice dovrebbe compilare, perché [class.ctor]/5
legge:
The implicitly-defined default constructor performs the set of initializations of the class that would be performed by a user-written default constructor for that class with no ctor-initializer (12.6.2) and an empty compound-statement. If that user-written default constructor would satisfy the requirements of a constexpr
constructor (7.1.5), the implicitly-defined default constructor is constexpr
.
E poiché S
è solo uno struct vuoto, il costruttore di default definito implicitamente è vuoto e quindi soddisfacente constexpr
requisiti.
Quindi qui si tratta dell'imperfezione dei compilatori, che in qualche modo devi risolvere in qualche modo.
Vecchia risposta:
Clang emette messaggio di errore più sensata:
main.cpp:3:13: error: default initialization of an object of const type 'const S'
requires a user-provided default constructor
constexpr S s2;
^
[dcl.constexpr]/9 fornisce la spiegazione e anche quasi esattamente il codice come un esempio:
A constexpr
specifier used in an object declaration declares the object as const. Such an object shall have literal type and shall be initialized.(...) [ Example:
struct pixel {
int x, y;
};
constexpr pixel ur = { 1294, 1024 };// OK
constexpr pixel origin; // error: initializer missing
—end example ]
fonte
2015-03-27 18:25:23
Per clang, * l'inizializzazione predefinita di un oggetto di tipo const 'const S' richiede un costruttore predefinito fornito dall'utente * [Demo] (http://coliru.stacked-crooked.com/a/858633b06d501e42) – Jarod42