Daha sonra dize ile ne yaptığınıza bağlıdır.
Sorunuz kodum doğru ise?o zaman evet öyle.
Kaynaktan [dcl.fct.default] / 2
[ Örnek : Beyan
void point(int = 3, int = 4);
int türünde sıfır, bir veya iki bağımsız değişkenle çağrılabilen bir işlevi bildirir. Aşağıdaki yollardan biriyle çağrılabilir:
point(1,2); point(1); point();
Son iki çağrı sırasıyla point(1,4)
ve ile eşdeğerdir point(3,4)
. - son örnek ]
Yani kodunuz etkili bir şekilde aşağıdakilere eşdeğerdir:
const std::string& s1 = foo(std::string(""));
std::string s2 = foo(std::string(""));
Tüm kodlarınız doğru, ancak dönüş türünün bir referans olması nedeniyle bu durumların hiçbirinde referans ömür boyu uzantısı yok.
Geçici olan bir işlevi çağırdığınız için, döndürülen dizenin ömrü ifadeyi uzatmaz.
const std::string& s1 = foo(std::string("")); // okay
s1; // not okay, s1 is dead. s1 is the temporary.
Örneğin s2
, doygunluğun bitiminden önce geçici olandan kopyaladığınız (veya taşıdığınız) ile örnek tamam. s3
ile aynı soruna sahip s1
.
std::string
Yapım ve yıkımı takip edebilmek için kendi sınıfınızla değiştirin .