2011-12-30 4 views
5

Questo programma non viene compilato utilizzando clang++ test.cpp -std=c++0x:errore di compilazione quando si chiama una mossa funzione di sovraccarico di un oggetto implicitamente convertibile

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 
} 

errori di compilazione:

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

Perché non si compila? Perché il compilatore preferisce A::operator = (A&&) su A::operator = (const A&)?

Inoltre, perché compila A a = b; mentre sia A a; a = b; (il programma precedente) che A a(b); no?

+0

Quale versione di Clang? – ildjarn

+3

FWIW, il tuo codice viene compilato così com'è con 'clang versione 3.0 (tag/RELEASE_30/final) Destinazione: x86_64-pc-linux-gnu Modello di thread: posix' e GCC 4.5.3 o 4.6.2 (ma ho nessuna idea se questo è normale o no) – Mat

+0

Sembra bug clang. –

risposta

4

Non sono sicuro di quale bug sia, ma la versione di Clang che si sta testando è piuttosto vecchia, soprattutto per quanto riguarda le funzionalità di C++ 11. Probabilmente vorrai utilizzare almeno lo 3.0 release of Clang, che accetta correttamente questo AFAIK. L'ho provato con una recente revisione del baule SVN Clang, e ha funzionato bene.

Dato che il supporto di C++ 11 di Clang è ancora in fase di sviluppo molto attivo, non stupitevi se ci sono anche bug nella versione 3.0. Potresti avere più successo con una build direttamente dal trunk SVN. Ci sono le istruzioni here per il controllo del codice da subversion e la creazione di un nuovo set di binari Clang.