Compilation error when calling an overloaded move function with an implicitly convertible object

This program cannot be compiled with 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
}

Compilation errors:

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

Why doesn't it compile? Why does the compiler prefer A::operator = (A&&)more A::operator = (const A&)?

Also, why is it A a = b;compiling while both A a; a = b;(the above program) are A a(b);not working?

+5
source share
1 answer

, , Clang, , , ++ 11. , , , 3.0 Clang, AFAIK. Clang SVN, .

, Clang ++ 11 , , 3.0 . SVN. Clang.

+4

All Articles