Diamo questo codice:C++: cast operatore vs. operatore di assegnazione contro priorità costruttore conversione
Test1 t1;
Test2 t2;
t1 = t2;
Credo che ci siano tre modi per implementare t1 = t2
- a (o più?) operatore sovraccarico assegnare in
Test1
- sovraccaricare tipo operatore cast in
Test2
- per creare
Test1(const Test2&)
conversione costruttore
Secondo il mio test GCC, questa è la priorità di ciò che viene utilizzato:
- operatore assegnazione
- conversione costruttore e operatore cast di tipo (ambiguo)
- const costruttore conversione e operatore di tipo const (ambiguo)
Per favore aiutami a capire perché questa priorità.
Io uso questo codice per il test (decommentare alcune linee per provare)
struct Test2;
struct Test1 {
Test1() { }
Test1(const Test2& t) { puts("const constructor wins"); }
// Test1(Test2& t) { puts("constructor wins"); }
// Test1& operator=(Test2& t) { puts("assign wins"); }
};
struct Test2 {
Test2() { }
// operator Test1() const { puts("const cast wins"); return Test1(); }
// operator Test1() { puts("cast wins"); return Test1(); }
};
int main() {
Test1 t1;
Test2 t2;
t1 = t2;
return 0;
}
'Test1 :: Test1 (const Test2 &)' non è un "costruttore di copie", è un "costruttore di conversione". – aschepler
Questo post spiega esattamente perché l'operatore di conversione ha una precedenza più alta: http://stackoverflow.com/questions/1384007/conversion-constructor-vs-conversion-operator-precedence –