Il messaggio compilatore è uno di quei messaggi che non hanno senso dal punto di vista linguistico, ma rivelano il funzionamento interno del compilatore, la sequenza in cui le sue opere logica interna.
Nel tuo caso si sta utilizzando un valore di rvalue (NULL
) per inizializzare un riferimento. Quando tale inizializzazione è consentita, il valore rval viene convertito in un oggetto temporaneo a cui verrà associato il riferimento. Quindi, il compilatore l'ha capito subito e ti ha informato del fatto con un messaggio diagnostico.
In realtà però, il trucco del genere è consentito solo per i riferimenti const
, quindi il codice è danneggiato, poiché il riferimento non è const
nel nostro caso. Inoltre, un riferimento struct
, come quello nel codice, non può essere inizializzato con il valore NULL
(che ha un tipo integrale), quindi è rotto anche per quel motivo.
Il messaggio del compilatore è piuttosto fuorviante. Il testo del messaggio sembra implicare che è illegale inizializzare i riferimenti dei membri con oggetti temporanei. In effetti, questo è legale in C++ (una volta risolti i problemi precedenti), anche se non ha senso. Ma, credo, una volta che il codice mal formati è accompagnato da almeno qualche messaggio di errore, dovrebbe essere OK per tutti ...
In genere non è vero che non è possibile costruire in modo predefinito una classe con un membro di riferimento. Ad esempio, il riferimento può essere associato a un oggetto dichiarato nello spazio dei nomi (oggetto "globale", in parole più semplici). – AnT
Come indicato, è possibile eseguire un costruttore predefinito se si utilizza una variabile predefinita (come nell'esempio seguente). –
Siete entrambi corretti. Tuttavia, sconsiglio di utilizzare un valore globale "nullo" - non può essere const, quindi il comportamento predefinito sarebbe utilizzare un oggetto globale che qualsiasi altra istanza della classe può modificare senza preavviso. –