2011-01-18 30 views
12

C++ 03'teki Bölüm 12.2.5, " yapıcısının ctor-initializer (12.6.2) dosyasındaki bir başvuru üyesine geçici olarak bağlı bir yapıcı çıkış yapana kadar devam eder. "
yüzden programıc'tor başlatıcı listesinde const const başvuruya geçici olarak bağlama

#include<iostream> 
using namespace std; 

struct foo 
{ 
    foo() 
    { 
    cout<<"foo c'tor"<<endl; 
    } 
    ~foo() 
    { 
    cout<<"foo d'tor"<<endl; 
    } 
}; 

struct bar 
{ 
    const foo &ref; 
    bar():ref(foo()) 
    { 
    cout<<"bar c'tor"<<endl; 
    } 

}; 

int main() 
{ 
    bar obj; 
}  

aşağıdaki çalıştı alıyorum çıktısı:

foo c'tor 
foo d'tor 
bar c'tor 
Şimdi standardına göre, geçici c'tor ini foo() tarafından oluşturulan

bar c'tor t-list foo d'torfoo d'torbar c'tor
sonra basılmalıdır, ancak başka bir şekilde.
Lütfen nedenini açıklayın.

+1

Kurucuda 'ref' referansını alırsanız ne olur? Belki de derleyici, aslında kullanılmadığından daha önce onu yok edeceğine karar verir. –

+2

VS2008, goc 4.3.4 'foo, foo, bar' output'u üreten' foo, bar, foo 'çıktısını üretir. İlginç ... – Naveen

+12

g ++ hata, rapor. –

cevap

3

MS VS 2010 denedim ve bana verir çıkışı da derleme sırasında uyarı verir:

uyarı C4413

: 'bar :: ref': Referans üyesi 'doesn bu geçici için başlatılır yapıcı MS VS 2010 doğru şartname uygulayan görünüyor

foo c'tor 
bar c'tor 
foo d'tor 
Press any key to continue . . . 

çıktıktan sonra t inat. G ++ için bir hata olduğunu kabul ediyorum.

DÜZENLEME: ref, kurucunun başlangıç ​​listesi içinde başlatılmalıdır.