Pregunta

Considere lo siguiente:

int ival = 1.01;
int &rval = 1.01; // error: non-const reference to a const value.
int &rval = ival;

rval = 1.01;

La primera asignación de & amp; rval a un valor literal falla como se esperaba. Si comento esa línea, el código se compila y se ejecuta. Entiendo por qué falla la inicialización, pero estoy confundido por qué la asignación a rval funciona en la última línea. No pensé que se le permitiera asignar una referencia a un valor literal.

EDITAR: Gracias por las respuestas rápidas. Estoy tentado a eliminar esto para ocultar mi vergüenza, pero creo que lo dejaré aquí para que todos los demás puedan señalar y reír.

En mi propia defensa, estoy trabajando en los ejercicios de un libro (C ++ Primer) y este problema se trata de la inicialización de referencia. Aún así, es bastante vergonzoso haber pasado por alto el punto de referencia en primer lugar. :)

¿Fue útil?

Solución

ival no es un valor literal, 1.01 es el valor literal. Se ha copiado a ival , que es una variable, que definitivamente puede tener sus referencias asignadas a otra variable.

Otros consejos

Después de que se inicializa la referencia, es un alias para lo que se inicializó. Una vez que se inicializa una referencia, no puede cambiar a qué se refiere la referencia. Sin embargo, puede cambiar la 'cosa' a la que se refiere la referencia (si la referencia no es const ).

La última línea está en efecto configurando la variable ival en 1.01 (nuevamente).

Aquí hay algo que puede sorprenderle al descubrir que puede hacer:

const int& x = 42;        // No error!

C ++ permite inicializar una referencia const con un valor literal (u otro valor r). Lo que realmente sucede es que el compilador crea un temporal copiando el RHS e inicializa la referencia para referirse a ese temporal. El compilador asegura que el temporal permanezca vivo hasta la salida del alcance (es decir, siempre que x salga del alcance en este caso).

Tenga en cuenta que esto no funciona al inicializar las variables miembro de una clase.

Tricky ¿eh? :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top