Cela dépend ensuite de ce que vous faites avec la chaîne.
Si votre question est, mon code est-il correct? alors oui c'est ça.
Depuis [dcl.fct.default] / 2
[ Exemple : la déclaration
void point(int = 3, int = 4);
déclare une fonction qui peut être appelée avec zéro, un ou deux arguments de type int. Il peut être appelé de l'une des manières suivantes:
point(1,2); point(1); point();
Les deux derniers appels sont équivalents à point(1,4)
et point(3,4)
, respectivement. - fin exemple ]
Votre code équivaut donc à:
const std::string& s1 = foo(std::string(""));
std::string s2 = foo(std::string(""));
Tout votre code est correct, mais il n'y a aucune extension de durée de vie de référence dans aucun de ces cas, car le type de retour est une référence.
Puisque vous appelez une fonction avec une valeur temporaire, la durée de vie de la chaîne renvoyée ne prolongera pas l'instruction.
const std::string& s1 = foo(std::string("")); // okay
s1; // not okay, s1 is dead. s1 is the temporary.
Votre exemple avec s2
est correct puisque vous copiez (ou déplacez) du temporaire avant la fin du satement. s3
a le même problème que s1
.
std::string
par une classe de votre choix pour suivre la construction et la destruction.