2011-12-30 14 views
5

Chương trình này không biên dịch sử dụng clang++ test.cpp -std=c++0x:Compile lỗi khi gọi một động thái chức năng quá tải với một đối tượng ngầm mui trần

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 
} 

Biên dịch lỗi:

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; } 
        ^

Tại sao nó không biên dịch? Tại sao trình biên dịch thích A::operator = (A&&) hơn A::operator = (const A&)?

Ngoài ra, tại sao A a = b; biên dịch trong khi cả hai A a; a = b; (chương trình trên) và A a(b); thì không?

+0

Phiên bản Clang nào? – ildjarn

+3

FWIW, mã của bạn biên dịch như là với 'clang phiên bản 3.0 (thẻ/RELEASE_30/final) Mục tiêu: x86_64-pc-linux-gnu Mô hình chủ đề: posix' và GCC 4.5.3 hoặc 4.6.2 (nhưng tôi có không có ý tưởng nếu đó là bình thường hay không) – Mat

+0

Có vẻ như lỗi clang. –

Trả lời

4

Tôi không chắc chắn lỗi này là gì, nhưng phiên bản của Clang bạn đang thử nghiệm là khá cũ, đặc biệt là đối với các tính năng C++ 11. Bạn có thể muốn sử dụng ít nhất là 3.0 release of Clang, chính xác chấp nhận AFAIK này. Tôi đã thử nghiệm nó với một sửa đổi gần đây của thân cây Clang SVN, và nó hoạt động tốt.

Cho rằng hỗ trợ C++ 11 của Clang vẫn đang được phát triển rất tích cực, đừng ngạc nhiên nếu có lỗi trong bản phát hành 3.0. Bạn có thể có nhiều thành công hơn với bản dựng trực tiếp từ thân cây SVN. Có các hướng dẫn here để kiểm tra mã từ lật đổ và xây dựng một bộ mã nhị phân Clang mới.