2015-06-06 9 views
10

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.

+0

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

+0

@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). –

+0

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 :) –

risposta

2

Il motivo per cui lo T() funziona è perché il compilatore lo interpreta come una dichiarazione di funzione che non accetta argomenti. La compilazione si farebbe con un casting esplicito:

static const int b = (const int) T{}; 
+0

Questo semplicemente non è vero. Non c'è modo in cui questa sintassi può essere interpretata come una dichiarazione di funzione. 'T()' è effettivamente equivalente a 'T {}'. Crea un * oggetto *, non una funzione. –

+0

Quindi, basta investigare di più per vederlo, prima di assumere. –

+0

Cosa sto assumendo? –

Problemi correlati