Это зависит от того, что вы будете делать со строкой впоследствии.
Если ваш вопрос , мой код правильный? , тогда да, это так.
С [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
в порядке, так как вы копируете (или перемещаете) из временного хранилища до окончания периода исполнения. s3
имеет ту же проблему, что и s1
.