Це залежить від того, що ви робите зі струною згодом.
Якщо у вашому питанні правильний мій код? тоді так.
Від [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
.
std::string
власний клас, щоб ви могли відслідковувати будівництво та руйнування.