Quando os valores dos parâmetros temporários ficam fora do escopo? [duplicado]

Duplicata Possível:
Tempo de vida dos temporários

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());

O exemplo acima poderia ser facilmente reescrito para usar ponteiros inteligentes em vez de strings; Eu encontrei essas duas situações muitas vezes. De qualquer forma, o exemplo acima irá construir uma string STL em ModernFunction, retorná-la, então pegar um ponteiro para uma string no estilo C dentro do objeto string, e depois passar esse ponteiro para a função legada.

Existe um objeto de string temporário que existe depois que o ModernFunction retornou. Quando sai do escopo?É possível para o compilador chamar c_str (), destruir esse objeto de seqüência de caracteres temporário e, em seguida, passar um ponteiro pendente para LegacyFunction? (Lembre-se de que o objeto string está gerenciando a memória em que c_str () retorna pontos de valor para ...)Se o código acima não é seguro, por que não é seguro, e existe uma maneira melhor e igualmente concisa de escrevê-lo do que adicionar uma variável temporária ao fazer as chamadas de função? Se é seguro, por quê?

questionAnswers(2)

yourAnswerToTheQuestion