2011-12-30 12 views
5

Este programa no compila utilizando clang++ test.cpp -std=c++0x:error de compilación cuando se llama a un movimiento función sobrecargada con un objeto convertir implícitamente

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 
} 

errores de compilación:

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

¿Por qué no compila? ¿Por qué el compilador prefiere A::operator = (A&&) sobre A::operator = (const A&)?

Además, ¿por qué se compilaría A a = b; mientras que A a; a = b; (el programa anterior) y A a(b); no?

+0

¿Qué versión de Clang? – ildjarn

+3

FWIW, su código se compila tal como está con 'clang versión 3.0 (tags/RELEASE_30/final) Objetivo: x86_64-pc-linux-gnu Modelo de subproceso: posix' y GCC 4.5.3 o 4.6.2 (pero tengo no tengo idea si eso es normal o no) – Mat

+0

Parece que hay un error de clang. –

Respuesta

4

No estoy seguro de qué error es esto, pero la versión de Clang que está probando es bastante antigua, especialmente con respecto a las características de C++ 11. Probablemente desee utilizar como mínimo el 3.0 release of Clang, que acepte correctamente este AFAIK. Lo probé con una revisión reciente del tronco Clang SVN, y funcionó bien.

Dado que el soporte C++ 11 de Clang aún se encuentra en desarrollo muy activo, no se sorprenda si también hay errores en la versión 3.0. Puede tener más éxito con una compilación directamente desde el tronco SVN. Hay instrucciones here para verificar el código de subversión y crear un nuevo conjunto de binarios de Clang.

Cuestiones relacionadas