2011-09-13 17 views
8

A continuación, ¿se creará un objeto temporal antes de que la referencia const se use para un objeto no const?const referencia al objeto non-const

const int y = 2000; 
const int &s = y // ok, const reference to const object. 

int x = 1000; 
const int &r = x; // any temporary copy here? 

Si no, ¿cómo funciona esto?

const int z = 3000; 
    int &t = z // ok, why can't you do this? 

Respuesta

13

No.

Una referencia es simplemente un alias para un objeto existente. const es impuesto por el compilador; simplemente comprueba que no intente modificar el objeto a través de la referencia r. * Esto no requiere una copia para ser creado.

Dado que const es simplemente una instrucción para el compilador para aplicar "solo lectura", entonces debería ser inmediatamente obvio por qué no se compila el ejemplo final. const sería inútil si pudiera eludirlo trivialmente tomando una referencia no const a un objeto const.

* Por supuesto, todavía puede modificar el objeto a través del x. Cualquier cambio también será visible a través del r, porque se refieren al mismo objeto.

+1

En particular, el valor de 'R' puede cambiar, a pesar de que se declara 'const'. – avakar

+0

Normalmente, los compiladores implementan la referencia con un simple puntero. –

+1

@quant_dev Dado el ejemplo de OP, el código fuente que menciona 'x' y el código fuente que menciona' r' se compilan en un código máquina idéntico. No hay indicadores involucrados (en todos los compiladores que he visto). No es que sea relevante de todos modos. – Cubbi

5

En

int x = 1000; 
const int &r = x; 

el lado derecho es una lvalue y el tipo de x es el mismo que el tipo de la referencia (ignorando CV-calificaciones). Bajo estas circunstancias, la referencia se adjunta directamente al x, no se crea temporal.

En cuanto a "cómo funciona esto" ... No entiendo qué fue lo que provocó su pregunta. Simplemente funciona de la manera más directa: la referencia se adjunta directamente al x. Nada más para eso.

No se puede hacer

const int z = 3000; 
int &t = z; 

porque viola las reglas de inmediato const-corrección.

+2

+1 para responder ambas partes – Lou

1

La comprensión de la referencia (&) responde a esta pregunta ..

de referencia es sólo un alias a la variable que se asigna a ella ..

Y const es una restricción impuesta por el compilador a la variable que se declara como const

int x = 1000; 
const int &r = x; 

En este caso, es una referencia constante a una variable no const. Lo que no puede cambiar los datos de x con la variable de referencia r (solo actúa sólo lectura) .. sin embargo, usted puede cambiar los datos x modificando x

const int z = 3000; 
int &t = z 

En este caso, la referencia no const al método constante, que no tiene sentido. Usted está diciendo que la referencia puede permitirle editar un miembro constante (lo cual nunca es posible).

lo tanto, si desea crear una referencia para un método constante, tiene que ser como el primer caso que ha mencionado

const int z = 3000; 
const int &t = z; 
Cuestiones relacionadas