ขึ้นอยู่กับสิ่งที่คุณทำกับสตริงหลังจากนั้น
หากคำถามของคุณคือรหัสของฉันถูกต้อง? ใช่แล้วใช่
จาก [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
ด้วยคลาสของคุณเองเพื่อให้คุณสามารถติดตามการก่อสร้างและการทำลายล้าง