Ошибка компиляции при вызове перегруженной функции перемещения с неявно конвертируемым объектом - PullRequest
5 голосов
/ 30 декабря 2011

Эта программа не компилируется с использованием 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); - нет?

1 Ответ

4 голосов
/ 02 января 2012

Я не уверен, что это за ошибка, но версия Clang, которую вы тестируете, довольно старая, особенно в отношении функций C ++ 11. Вы, вероятно, хотите использовать как минимум версию 3.0 Clang , которая правильно принимает этот AFAIK. Я протестировал его с недавней ревизией Clang SVN trunk, и он работал нормально.

Учитывая, что поддержка Clang C ++ 11 все еще находится в стадии активной разработки, не удивляйтесь, если в версии 3.0 также есть ошибки. Вы можете добиться большего успеха со сборкой непосредственно из соединительной линии SVN. Здесь есть инструкции для проверки кода из Subversion и создания нового набора двоичных файлов Clang.

...