2012-07-19 14 views
53

Olası Çoğalt:
Does a const reference prolong the life of a temporary?geçici nesne dönen ve const referans bağlanma

const referansa geçici atama hakkında şikayet etmiyor Benim derleyici:

string foo() { 
    return string("123"); 
}; 

int main() { 
    const string& val = foo(); 
    printf("%s\n", val.c_str()); 
    return 0; 
} 

Neden ? foo'dan döndürülen dizenin geçicidir ve val, ömür boyu bitmiş nesneye işaret edebilir. C++ standardı buna izin veriyor mu ve iade edilen nesnenin ömrünü uzatıyor mu?

+4

Evet, geçici bir süre, bir ** const ** başvurusu olduğu sürece uzatılır. – chris

+2

Bu tam olarak 2784262 kopyası değil, referansın bir sınıf üyesi olduğu davayı ele almalıdır. Davranış farklıdır. – aberaud

+1

@aberaud sadece bu bir kopya değil, bulduğum için çok daha iyi bir soru. – dashesy

cevap

66

Bu bir C++ özelliğidir. Kod geçerli ve tam olarak yaptığı gibi görünüyor.

Normal olarak, geçici bir nesne, içinde göründüğü tam ifadenin sonuna kadar sürer. Bununla birlikte, C++ geçici bir nesneyi yığındaki yapıya bir referansa bağlamanın, referansın ömrü boyunca geçici sürenin ömrünü uzattığını ve dolayısıyla normal bir sallantı-referans hatası olacağından kaçınılmasını kasten belirler. Yukarıdaki örnekte, foo() tarafından döndürülen geçici kapanış küme ayracı olana kadar geçer.

P.S: Bu yalnızca yığın tabanlı başvurular için geçerlidir. Nesnelerin üyeleri olan referanslar için çalışmaz.

Tüm metin: GotW #88: A Candidate For the “Most Important const” by Herb Sutter.

+2

Ayrıca, buradaki dizide hiçbir kopyalama yapılmadığında, dizge için bir kopya kurucusunun bulunması ve erişilebilir olması gerektiğini lütfen unutmayın. – xryl669

+0

** PS **, bu çok önemlidir ve yukarıda bağlı dupe SO iş parçacığı, bu –

+0

@ xryl669'un iyi örneklerine sahiptir [C++ 17 Garantili kopya elence] (http: //www.open-std. org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html) artık kopyalama kurucusuna gerek yok mu? quote: '' 'kaynak nesne geçici olduğunda' '' – dashesy

İlgili konular