2011-12-30 13 views
5

इस कार्यक्रम clang++ test.cpp -std=c++0x का उपयोग कर संकलन नहीं है बुला:संकलन त्रुटि जब एक कदम एक परोक्ष परिवर्तनीय वस्तु के साथ अतिभारित समारोह

class A 
{ 
public: 
    A() {} 
    A(const A&) {} 
    A(A&&) {} 
    A& operator = (const A&) { return *this; } 
    A& operator = (A&&) { return *this; } 
}; 

class B 
{ 
    A m_a; 
public: 
    operator const A &() const 
    { 
     return m_a; 
    } 
}; 

int main(int, char**) 
{ 
    A a; 
    B b; 
    a = b; // compile error 
} 

त्रुटियों संकलित करें:

Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn) 

test.cpp:25:9: error: no viable conversion from 'B' to 'A' 
    a = b; 
     ^
test.cpp:5:5: note: candidate constructor not viable: no known conversion from 'B' to 
     'const A &' for 1st argument 
    A(const A&) {} 
    ^
test.cpp:6:5: note: candidate constructor not viable: no known conversion from 'B' to 'A &&' 
     for 1st argument 
    A(A&&) {} 
    ^
test.cpp:15:5: note: candidate function 
    operator const A &() const 
    ^
test.cpp:8:23: note: passing argument to parameter here 
    A& operator = (A&&) { return *this; } 
        ^

यह क्यों संकलन नहीं करता है? क्यों संकलक A::operator = (A&&)A::operator = (const A&) से अधिक पसंद करते हैं करता है?

इसके अलावा, A a = b; संकलित क्यों होगा जबकि A a; a = b; (उपर्युक्त प्रोग्राम) और A a(b); दोनों नहीं?

+0

बजना के किन संस्करणों? – ildjarn

+3

FWIW, आपका कोड 'क्लैंग संस्करण 3.0 (टैग/RELEASE_30/अंतिम) लक्ष्य के साथ संकलित है: x86_64-pc-linux-gnu थ्रेड मॉडल: पॉज़िक्स' और जीसीसी 4.5.3 या 4.6.2 (लेकिन मेरे पास है कोई विचार नहीं है कि यह सामान्य है या नहीं) – Mat

+0

क्लैंग बग की तरह लगता है। –

उत्तर

4

मुझे यकीन है कि क्या बग यह है नहीं कर रहा हूँ, लेकिन बजना परीक्षण किए जाने के संस्करण काफी पुराना है, विशेष रूप से सी ++ 11 सुविधाओं के संबंध में। आप शायद कम से कम 3.0 release of Clang पर उपयोग करना चाहते हैं, जो इस AFAIK को सही ढंग से स्वीकार करता है। मैंने क्लेंग एसवीएन ट्रंक के हालिया संशोधन के साथ इसका परीक्षण किया, और यह ठीक काम किया।

को देखते हुए बजना के सी ++ 11 समर्थन बहुत सक्रिय विकास के अंतर्गत अभी भी है कि, हैरान करता है, तो वहाँ भी 3.0 रिलीज में कीड़े हैं नहीं है। आपको एसवीएन ट्रंक से सीधे निर्माण के साथ और अधिक सफलता मिल सकती है। उपखंड से कोड की जांच करने और क्लैंग बाइनरी का एक नया सेट बनाने के लिए निर्देश here हैं।

संबंधित मुद्दे