2012-03-06 7 views
6

Duplicar posible:
Does a const reference prolong the life of a temporary?¿Qué sucede cuando asigno una int temporal a una referencia constante en C++?

Digamos que tengo una función f:

int f(int x){return x;} 

const int &a=f(1); 

sé que f(1) es sólo un temporal y que habrá destruido después de esta declaración, pero

  1. ¿hacer la referencia const le dará a f (1) una larga vida útil?
  2. si es así, ¿dónde f(1) se va a almacenar?
  3. y significa que x tampoco se destruyó cuando se quedó sin alcance?
  4. ¿cuál es la diferencia entre f(1) y x?
+0

Necesita un buen libro de C++. Consulte http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

+4

@Ben Pocos (incluso buenos) libros cubren esto. –

+0

@Konrad: Tal vez se estaba refiriendo a la última pregunta ... –

Respuesta

8

Estás confundiendo expresiones con valores.

1) La vida útil del valor temporal devuelto por la expresión f(1) tendrá su duración extendida. Esta regla es única para las referencias const.

2) Donde quiera que el compilador quiera, pero probablemente en la pila.

3) Tal vez. Depende de si el compilador copió x o realizó elisión de copia. Como el tipo es int, no importa.

4) Muchas diferencias. Uno es el nombre de una variable local dentro de int f(int). Es un lvalue La otra es una expresión que llama al int f(int) y se evalúa como un valor r.

+0

: Sé que las expresiones devuelven valor, pero cómo se almacenan estos valores en f (1), ¿el compilador simplemente asigna f (1) a 1 como este: int f (1) = 1 ; o algo mas ? – AlexDan

2

Enlazando un temporal a un const& extiende la vida útil del temporal a la duración de la referencia.

+0

si extiende la vida útil del temporal, ¿dónde se almacena f (1) y tiene su propia dirección y se puede cambiar como una variable normal? – AlexDan

+0

@AbdessamadBond Si se puede cambiar como una variable normal es (creo) una pregunta abierta; necesitarías un 'const_cast' para poder cambiarlo, e incluso entonces, los resultados podrían ser un comportamiento indefinido. (Creo que la intención era que fueran un comportamiento indefinido, pero estoy lejos de estar seguro de que la redacción que lo exige aparezca en el estándar.) –

+0

@JamesKanze El único caso en que UB puede ser causado por un 'const_cast' es si el objeto ha sido declarado 'const'. Hasta donde puedo ver, este nunca es el caso para un temporal. – pmr

Cuestiones relacionadas