2011-03-28 25 views
10

Duplicar posibles:
C++: Life span of temporary arguments?límites de expresión completa y la duración de los temporales

Se dice que las variables temporales se destruyen como el último paso en la evaluación de la expresión completa, por ejemplo,

bar(foo().c_str()); 

puntero temporal vive hasta el regreso de la barra, pero lo que para el

baz(bar(foo().c_str())); 

es que aún vive hasta el regreso de la barra, o el retorno Baz significa extremo expresión completa aquí, compiladores he comprobado objetos destructibles después Baz regresa, pero ¿puedo confiar en eso?

+0

sí, la respuesta a esta pregunta debe ser una parte de http://stackoverflow.com/questions/4214153/lifetime-of-temporaries, pregunté una nueva porque no tengo derecho a publicar comentarios allí y estaba interesado en un detalle específico que no está cubierto allí. – Vasaka

Respuesta

10

Temporarios de duración hasta el final de la expresión completa en la que se crean. Una "expresión completa" es una expresión que no es una sub-expresión de otra expresión.

En baz(bar(...));, bar(...) es una subexpresión de baz(...), mientras baz(...) no es una subexpresión de nada. Por lo tanto, baz(...) es la expresión completa, y todos los temporales creados durante la evaluación de esta expresión no se eliminarán hasta que se devuelva baz(...).

+2

Tenga en cuenta, sin embargo, que los constructores son un caso especial (creo - 90% seguro), por lo que en 'baz (X (foo(). C_str()));', donde 'X' es una clase y el argumento para 'baz' es una llamada al constructor' X', la vida útil de 'c_string' terminará cuando el constructor salga. –

3

Como su nombre lo indica, la expresión completa es toda la expresión, incluida la llamada al baz(), por lo que el temporario vivirá hasta que regrese la llamada a baz().

Cuestiones relacionadas