¿Cuándo los valores de los parámetros temporales quedan fuera del alcance? [duplicar]

Posible duplicado:
Vida de los temporales.

int LegacyFunction(const char *s) {
    // do something with s, like print it to standard output
    // this function does NOT retain any pointer to s after it returns.
    return strlen(s);
}

std::string ModernFunction() {
    // do something that returns a string
    return "Hello";
}

LegacyFunction(ModernFunction().c_str());

El ejemplo anterior podría reescribirse fácilmente para usar punteros inteligentes en lugar de cadenas; He encontrado ambas situaciones muchas veces. De todos modos, el ejemplo anterior construirá una cadena STL en ModernFunction, la devolverá, luego obtendrá un puntero a una cadena de estilo C dentro del objeto de cadena y luego pasará ese puntero a la función heredada.

Hay un objeto de cadena temporal que existe después de que ModernFunction haya regresado. ¿Cuándo sale fuera de alcance?¿Es posible que el compilador llame a c_str (), destruya este objeto de cadena temporal y luego pase un puntero colgante a LegacyFunction? (Recuerde que el objeto de cadena está administrando la memoria a la que c_str () devuelve puntos de valor a ...)Si el código anterior no es seguro, ¿por qué no es seguro y existe una forma mejor y más concisa de escribirlo que agregar una variable temporal al realizar las llamadas de función? Si es seguro, ¿por qué?

Respuestas a la pregunta(2)

Su respuesta a la pregunta