2009-08-21 26 views
9

için başvuru başvuru bağlama this sorusunda çalışırken tutarsız bir davranış buldum.const başvuru bir

Referans bağlama neden bir yapıcıda ortak bir işlevden farklı davranıyor?

struct A { 
}; 

struct B : public A { 
    B(){} 
private: 
    B(const B&); 
}; 

void f(const B& b) {} 

int main() { 
    A a(B()); // works 
    A const & a2 = B(); // C++0x: works, C++03: fails 
    f(B()); // C++0x: works, C++03: fails 
} 

C++ ++ g ile 03 için test ettik - sıkı C++ 03 modunda 4.1 ve Comeau 4.2.45.2 ve devre dışı C++ 0x uzantıları ile. Aynı sonuçları aldım.

C++ 0x için g ++ - 4.4 ve Comeau 4.3.9 ile rahat modda ve C++ 0x uzantıları etkinleştirildi. Aynı sonuçları aldım.

cevap

16
A a(B()); 

bir bir A dönen ve bir B. here bakınız dönen değişken olmayan bir işlev için bir işaretçi alarak adlı bir fonksiyonun bildirimidir. parantez ekleyerek ve beklediğiniz hatayı alırsınız:

A a((B())); 
+7

Famously "en can sıkıcı parse" olarak da bilinir. – earl

+0

Ben bir gün "en çok rahatsız edici ayrıştırma sorun kurbanı düştü" diyebileceğim gün için sabırsızlanıyorum. Tabii ki bu zamana kadar tamamen unutacağım ve C++ 'dan nefret etmeye geri döneceğim. –

İlgili konular