Nó phụ thuộc vào những gì bạn làm với chuỗi sau đó.
Nếu câu hỏi của bạn là mã của tôi chính xác? đúng vậy
Từ [dcl.fct.default] / 2
[ Ví dụ : Tuyên bố
void point(int = 3, int = 4);
khai báo một hàm có thể được gọi bằng 0, một hoặc hai đối số kiểu int. Nó có thể được gọi theo bất kỳ cách nào sau đây:
point(1,2); point(1); point();
Hai cuộc gọi cuối cùng tương ứng point(1,4)
và point(3,4)
, tương ứng. - ví dụ cuối ]
Vì vậy, mã của bạn có hiệu quả tương đương với:
const std::string& s1 = foo(std::string(""));
std::string s2 = foo(std::string(""));
Tất cả mã của bạn là chính xác, nhưng không có phần mở rộng trọn đời tham chiếu trong bất kỳ trường hợp nào, vì kiểu trả về là tham chiếu.
Vì bạn gọi hàm bằng tạm thời, thời gian tồn tại của chuỗi trả về sẽ không mở rộng câu lệnh.
const std::string& s1 = foo(std::string("")); // okay
s1; // not okay, s1 is dead. s1 is the temporary.
Ví dụ của bạn s2
là ổn vì bạn sao chép (hoặc di chuyển) từ tạm thời trước khi kết thúc thời gian bão hòa. s3
có cùng một vấn đề hơn s1
.
std::string
bằng một lớp của riêng bạn để bạn có thể theo dõi xây dựng và phá hủy.