Questo codice molto semplice dà un errore in GCC 6.0:Utilizzo parentesi graffe a valore-inizializzare temporaneo come inizializzatore di membro di dati static cause di errore
template<class T>
struct S {
// error: cannot convert 'T' to 'const int' in initialization
static const int b = T{};
};
int main() {
}
Stranamente, se uso bretelle regolare invece (T()
) quindi compila il codice. è un insetto? Il codice si compila bene in clang.
Non ho una risposta, posso solo suggerire una possibile ragione. T {} significa che T non è un tipo base, quindi non vi è alcuna conversione in int. Ma quando usi T(), T può essere int o qualsiasi altra cosa. –
@SergiiKhaperskov 'T {}' è definito colloquialmente come "inizializzazione uniforme" (sebbene lo standard non usi il termine). Qualsiasi tipo di dati incorporato o meno può essere inizializzato utilizzando una coppia di parentesi graffe. Questo è stato aggiunto in C++ 11 principalmente per aggirare il problema [Most Vexing Parse] (http://en.wikipedia.org/wiki/Most_vexing_parse). –
Capito. Non sapevo che i tipi di base possano essere inizializzati con {}. Pensavo che fosse solo per oggetti, matrici e contenitori. Ci scusiamo per il tuo tempo :) –