El mensaje compilador es uno de esos mensajes que no tienen sentido desde el punto de vista del lenguaje, pero revelan el funcionamiento interno del compilador, la secuencia en la que sus obras lógicas internas.
En su caso está utilizando un valor r (NULL
) para inicializar una referencia. Cuando se permite dicha inicialización, el valor r se convierte en un objeto temporal, al que se vinculará la referencia. Entonces, el compilador se dio cuenta de inmediato y le informó sobre el hecho con un mensaje de diagnóstico.
En realidad, el truco como ese solo está permitido para las referencias const
, por lo que su código está roto, ya que la referencia no es const
en nuestro caso. Además, una referencia struct
, como la de su código, no se puede inicializar con NULL
rvalue (que tiene un tipo integral), por lo que también se rompe por ese motivo.
El mensaje del compilador es bastante confuso. El texto del mensaje parece implicar que es ilegal inicializar referencias de miembros con objetos temporales. De hecho, esto es legal en C++ (una vez que se resuelven los problemas anteriores), aunque no tiene sentido. Sin embargo, creo que, una vez que el código mal formada se acompaña de al menos algunos mensaje de error, debería estar bien para todo el mundo ...
En general, no es cierto que no pueda construir una clase por defecto con un miembro de referencia. Por ejemplo, la referencia puede vincularse a un objeto declarado en el ámbito del espacio de nombres (objeto "global", en palabras más simples). – AnT
Como se señaló, puede hacer un constructor predeterminado si usa una variable predefinida (como en mi ejemplo a continuación). –
Ambos son correctos. Sin embargo, desaconsejaría usar un valor "nulo" global; no puede ser const, por lo que el comportamiento predeterminado sería usar un objeto global que cualquier otra instancia de la clase pueda cambiar sin previo aviso. –