stavo giocando con un po 'di codice inutile per comprendere l'inizializzazione di riferimenti membri, e sono imbattuto in questo:inizializzazione di membro di riferimento const nella lista di inizializzazione
struct A {};
struct B
{
B() : a()
{
}
const A& a;
};
Il codice di cui sopra dà il seguente errore quando si compila con gcc 4.9. 2:
In constructor 'B::B()':
error: value-initialization of reference type 'const A&'
B() : a()
Che ho capito.
Ma se io uso l'inizializzazione divisa in lista di inizializzazione del costruttore di B, in questo modo:
struct A {};
struct B
{
B() : a{}
{
}
const A& a;
};
Si compila bene.
Quindi la domanda è, perché l'uso di inizializzazione uniforme qui modificare il risultato della compilazione?
Ho provato anche questo con Microsoft Visual C++ 2013. Esso non può essere compilato sia la versione del codice, con lo stesso messaggio di errore:
Error 3 error C2440: 'initializing' : cannot convert from 'int' to 'const A &
si può avere un gioco rapido con esso qui:
L'inizializzazione uniforme è una funzionalità relativamente nuova e ci si deve aspettare alcuni bug del compilatore. In questo caso, senza doverlo cercare, suppongo che il compilatore Microsoft sia corretto. –
La mia ipotesi: '{}' è interpretato come una chiamata al costruttore predefinito di 'A' (come se si facesse' A a {}; '), quindi viene creato un' A {} 'temporaneo. È quindi legato al const-ref e la sua durata è estesa (come se tu fossi 'const A & a {}', che funziona anche in GCC). Ma non so cosa lo dice lo standard; se è permesso ... Ciò che veramente mi confonde è che MSVC vede un 'int' che non riesco a vedere ... Hai davvero compilato questo codice? – leemes
@JamesKanze Lo capisco, ma non volevo uscire e urlare bug del compilatore. Forse c'è qualcosa sull'inizializzazione uniforme che non conosco e che si comporterebbe diversamente in questa situazione. – Hugo