Tiempo de vida de los temporales

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é?

std::string foo() { std::string out = something...; return out; } void bar( const char* ccp ) { // do something with the string.. } bar( foo().c_str() ); 

$ 12.2 / 3- “Los objetos temporales se destruyen como el último paso en la evaluación de la expresión completa (1.9) que (léxicamente) contiene el punto donde se crearon. Esto es cierto incluso si esa evaluación termina arrojando una excepción”.

El tiempo de vida 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 función ‘bar’.

EDICION 2:

$ 1.9 / 12- “Una expresión completa es una expresión que no es una subexpresión de otra expresión. Si se define una construcción de lenguaje para producir una llamada implícita de una función, se considera que el uso de la construcción de lenguaje es una expresión para la propósitos de esta definición “.

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. Déjame demostrar con arte ASCII:

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