Itu tergantung pada apa yang Anda lakukan dengan string sesudahnya.
Jika pertanyaan Anda apakah kode saya benar? maka ya itu.
Dari [dcl.fct.default] / 2
[ Contoh : Deklarasi
void point(int = 3, int = 4);
mendeklarasikan fungsi yang bisa dipanggil dengan nol, satu, atau dua argumen bertipe int. Ini dapat dipanggil dengan salah satu dari cara-cara ini:
point(1,2); point(1); point();
Dua panggilan terakhir setara dengan point(1,4)
dan point(3,4)
, masing-masing. - contoh akhir ]
Jadi kode Anda secara efektif setara dengan:
const std::string& s1 = foo(std::string(""));
std::string s2 = foo(std::string(""));
Semua kode Anda benar, tetapi tidak ada ekstensi seumur hidup referensi dalam semua kasus ini, karena jenis pengembalian adalah referensi.
Karena Anda memanggil fungsi dengan sementara, masa string yang dikembalikan tidak akan memperpanjang pernyataan.
const std::string& s1 = foo(std::string("")); // okay
s1; // not okay, s1 is dead. s1 is the temporary.
Contoh Anda dengan s2
tidak apa-apa karena Anda menyalin (atau memindahkan) dari sementara sebelum akhir satement. s3
memiliki masalah yang sama dengan s1
.
std::string
dengan kelas Anda sendiri sehingga Anda dapat melacak konstruksi dan penghancuran.