Es hängt davon ab, was Sie danach mit der Zeichenfolge machen.
Wenn Ihre Frage ist, ist mein Code korrekt?dann ist es ja.
Aus [dcl.fct.default] / 2
[ Beispiel : Die Erklärung
void point(int = 3, int = 4);
deklariert eine Funktion, die mit null, eins oder zwei Argumenten vom Typ int aufgerufen werden kann. Es kann auf eine der folgenden Arten aufgerufen werden:
point(1,2); point(1); point();
Die letzten beiden Anrufe sind äquivalent zu point(1,4)
und point(3,4)
verbunden. - Beispiel beenden ]
Ihr Code entspricht also effektiv:
const std::string& s1 = foo(std::string(""));
std::string s2 = foo(std::string(""));
Ihr gesamter Code ist korrekt, aber in keinem dieser Fälle gibt es eine Verlängerung der Referenzlebensdauer, da der Rückgabetyp eine Referenz ist.
Da Sie eine Funktion mit einer temporären Zeichenfolge aufrufen, verlängert die Lebensdauer der zurückgegebenen Zeichenfolge die Anweisung nicht.
const std::string& s1 = foo(std::string("")); // okay
s1; // not okay, s1 is dead. s1 is the temporary.
Ihr Beispiel mit s2
ist in Ordnung, da Sie vor dem Ende des Satements aus dem Temporären kopieren (oder verschieben). s3
hat das gleiche Problem als s1
.
std::string
durch eine eigene Klasse, damit Sie den Bau und die Zerstörung verfolgen können.