Kiedy tymczasowe wartości parametrów wykraczają poza zakres? [duplikować]

Możliwy duplikat:
Czas życia tymczasowych

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

Powyższy przykład można łatwo przepisać, aby używać inteligentnych wskaźników zamiast łańcuchów; Spotkałem obie te sytuacje wiele razy. W każdym razie powyższy przykład skonstruuje łańcuch STL w ModernFunction, zwróci go, a następnie weźmie wskaźnik do łańcucha w stylu C wewnątrz obiektu łańcuchowego, a następnie przekaże ten wskaźnik do poprzedniej funkcji.

Istnieje tymczasowy obiekt ciągu, który istnieje po zwróceniu funkcji ModernFunction. Kiedy wychodzi poza zakres?Czy kompilator może wywołać c_str (), zniszczyć ten tymczasowy obiekt ciągu, a następnie przekazać zwisający wskaźnik do funkcji LegacyFunction? (Pamiętaj, że obiekt string zarządza pamięcią zwracaną przez wartość c_str () do ...)Jeśli powyższy kod nie jest bezpieczny, dlaczego nie jest bezpieczny, i czy istnieje lepszy, równie zwięzły sposób na jego zapisanie niż dodanie tymczasowej zmiennej podczas wywoływania funkcji? Jeśli to bezpieczne, dlaczego?

questionAnswers(2)

yourAnswerToTheQuestion