2010-11-10 11 views
6

referans:değer başlatma const üyesinin aşağıdaki formu kod arıyorum

class foo 
{ 
    public: 
    foo() {} 

    //... 
}; 

class bar 
{ 
    public: 
    bar() : ref() {} 

    private: 
    const foo &ref; 
}; 

doğru bu şekilde geçici kullanarak bir başvuru başlatılıyor mı? Yerel bir değişken olan bir const referansının bir geçici ile başlatılmasının mümkün olduğunu biliyorum ve bunu yapmak, geçici olarak, örn.

const foo &tmp = funcThatReturnsByValue(); //OK 

Bununla birlikte, ilgili initialize reference in initialization list verilen cevapların bir "kısa ömürlü" ve "uzun ömürlü" referansları, ve yukarıdaki gibi ref başlatılıyor olduğu tanımlanmamış bir davranış (hatta ref olsa arasında bir fark olduğunu göstermektedir const referansıdır).

Standartta 12.2.5, "Bir yapıcının ctor-initializer öğesindeki referans üyesine geçici olarak bağlı, yapıcı çıkana kadar devam eder." Bu durumu açıklayan mı?

+0

Kodunuzu, aslında geçici bir şekilde içerecek şekilde düzeltebilir misiniz? –

+0

ref(), geçici bir örnek olayına ref başvurmuyor mu? Terminolojim kesin değilse üzgünüm ... Bu kod snippet'ini anlamak için elimden geleni yapıyorum. – user168715

+0

Belki bu yorum değersizdir (bu koda baktığınız bağlamı bilmiyorum), ancak 'ref' bir işaretçiyse sorun ortadan kalkar. Buradaki nokta, referansların değer olarak başlatılamaması, ancak işaretçilerin (sıfır başlatılmış olmaları) olabilir. Ayrıca, çoğu derleyici (en azından MSVC), bir varsayılan atama işleci oluşturamadığı için bir uyarı verir. Bir kılavuz olarak, bir referans üye istediğinde, aslında bir işaretçi istersiniz ... –

cevap

4

Bu kod bozuk biçimlidir. Bir referansı varsayılan olarak başlatamaz veya değer başlatamazsınız.

Gerçekte ref()'un içinde bir ifadeniz varsa, evet, 12.2.5 geçerli olur ve yapıcı çıktığında geçici olarak yok olur.

bar() : ref(foo()) {} 

ama safça buna bir gönderme var kadar geçici yaşam boyu uzatılmış olduğunu sanmıyorum:

+1

Düşünürsünüz, ama aslında bunu yapmak için GCC 4.3.4'ü alamıyorum. –

1

Ben ne yapmak istiyorum sanırım. Hayır, aslında değil. Yani, const olsun ya da olmasın, referansı normal bir nesne ile başlatabilirsiniz.

2

Sizin örnek geçici yaratmak değil - sen değiştirmek gerekir yapmak için: Geçici bir referans bağlayıcı ediyoruz Şimdi

bar() : ref(foo()) {} 

ve bu geçici nesne sonunda imha edilecek Kurucu Referansınız geçersiz olacak ve bu iyi bir şey değil.

İlgili konular