2010-11-18 15 views
35

El siguiente código funciona bien, pero ¿por qué es este código correcto? ¿Por qué es válido el puntero "c_str()" del temporal devuelto por foo()? Pensé, que este temporal ya está destruido cuando se ingresa barra(), pero no parece ser así. Entonces, ahora supongo que el temporal devuelto por foo() se destruirá después de la llamada a la barra() - ¿es correcto? ¿Y por qué?Vida útil de los temporales

std::string foo() { 
    std::string out = something...; 
    return out; 
} 

void bar(const char* ccp) { 
    // do something with the string.. 
} 

bar(foo().c_str()); 

Respuesta

42

$ 12.2/3- "objetos temporales se destruidos como el último paso en la evaluación de la expresión completa (1.9) que (léxico) contiene el punto donde fueron creados. Esto es cierto , incluso si esa evaluación termina en lanzando una excepción. "

La vida útil del temporal devuelto por foo() se extiende hasta el final de la expresión completa donde se crea, es decir, hasta el final de la llamada de la función 'bar'.

EDIT 2:.

$ 1,9/12- "A-plena expresión es una expresión que no es una subexpresión de otra expresión Si un idioma constructo se define para producir un llamada implícita de una función, un uso de , la construcción del lenguaje se considera como una expresión para los propósitos de esta definición. "

+1

También tenga en cuenta que 'c_str()' solo devuelve un * puntero temporal *. Su duración no dice nada sobre la duración de los datos que apunta. – jalf

+4

'c_str()' no devuelve nada temporal. Devuelve un rvalue de tipo puntero. Los valores R de tipo puntero no son objetos. No tienen vida. –

61

Un objeto temporal se destruye cuando la expresión completa que contiene léxicamente el valor r cuya evaluación creó ese objeto temporal se evalúa por completo. Permítanme demostrar con arte ASCII:

____________________ full-expression ranges from 'b' to last ')' 
bar(foo().c_str()); 
    ^^^^^  ^
     |   | 
    birth  funeral 
+9

Las ilustraciones metafóricas dentro del arte ASCII :) son muy ilustrativas. Realmente me gustaron – Chubsdad

Cuestiones relacionadas