Wann werden temporäre Parameterwerte ungültig? [Duplikat]

Mögliche Duplikate:
Lebenszeit von Provisorien

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

Das obige Beispiel könnte leicht umgeschrieben werden, um intelligente Zeiger anstelle von Zeichenfolgen zu verwenden. Ich bin diesen beiden Situationen schon oft begegnet. Wie auch immer, im obigen Beispiel wird eine STL-Zeichenfolge in ModernFunction erstellt, zurückgegeben, dann ein Zeiger auf eine Zeichenfolge im C-Stil innerhalb des Zeichenfolgenobjekts abgerufen und dieser Zeiger dann an die Legacyfunktion übergeben.

Es gibt ein temporäres Zeichenfolgenobjekt, das nach der Rückgabe von ModernFunction vorhanden ist. Wann wird der Geltungsbereich verlassen?Ist es dem Compiler möglich, c_str () aufzurufen, dieses temporäre Zeichenfolgenobjekt zu zerstören und dann einen baumelnden Zeiger an LegacyFunction zu übergeben? (Denken Sie daran, dass das String-Objekt den Speicher verwaltet, auf den c_str () als Rückgabewert verweist.)Wenn der obige Code nicht sicher ist, warum ist er nicht sicher, und gibt es eine bessere, ebenso übersichtliche Möglichkeit, ihn zu schreiben, als beim Ausführen der Funktionsaufrufe eine temporäre Variable hinzuzufügen? Wenn es sicher ist, warum?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage