Это зависит от того, что вы делаете со строкой впоследствии.
Если ваш вопрос правильный мой код? тогда да, это так.
Из [dcl.fct.default] / 2
[ Пример : объявление
void point(int = 3, int = 4);
объявляет функцию, которая может быть вызвана с нулем, одним или двумя аргументами типа int. Это можно назвать любым из этих способов:
point(1,2); point(1); point();
Последние два вызова эквивалентны point(1,4)
и point(3,4)
, соответственно. - конец примера ]
Таким образом, ваш код фактически эквивалентен:
const std::string& s1 = foo(std::string(""));
std::string s2 = foo(std::string(""));
Весь ваш код верен, но ни в одном из этих случаев продление срока службы ссылок отсутствует, поскольку возвращаемый тип является ссылкой.
Поскольку вы вызываете функцию с временным значением, время жизни возвращаемой строки не будет расширять оператор.
const std::string& s1 = foo(std::string("")); // okay
s1; // not okay, s1 is dead. s1 is the temporary.
Ваш пример с s2
хорошо, так как вы копируете (или перемещаете) из временного до конца satement. s3
имеет ту же проблему, чем s1
.
std::string
собственным классом, чтобы вы могли отслеживать строительство и разрушение.