Das ist, was ich ursprünglich getan habe.Entfernen der Const in Kopie Konstruktor
class A
{ public:
A() { std::cout << "\ndefault constructor"; }
A(const A&) { std::cout << "\ncopy constructor"; }
A(int) { std::cout << "\nconversion constructor"; }
};
A a0; // print default constructor
A a1(a0); // print copy constructor note : direct initialization
A a2 = a0; // print copy constructor note : copy initialization
A a3(123); // print conversion constructor note : direct initialization
A a4 = 123; // print conversion constructor note : copy initialization (create a temp object from int)
Wenn jedoch der Klasse A etwas wie die folgenden (entfernen const in Copykonstruktor) geändert wird, warum gibt es Fehler für die letzte Zeile kompilieren? danke
class A
{ public:
A() { std::cout << "\ndefault constructor"; }
A(A&) { std::cout << "\ncopy constructor"; }
A(int) { std::cout << "\nconversion constructor"; }
};
A a0; // print default constructor
A a1(a0); // print copy constructor note : direct initialization
A a2 = a0; // print copy constructor note : copy initialization
A a3(123); // print conversion constructor note : direct initialization
//A a4 = 123; // compile error
Temporäres Objekt wird an der Zeile zerstört, an der es erstellt wurde, daher denkt der Compiler, dass Sie es modifizieren werden, wenn Sie es als non const-Verweis übergeben (es gibt eine Möglichkeit, dass Sie es ändern, wenn Sie eine nicht konstante Referenz übergeben) , aber es zu modifizieren ist illegal, da es bei diesem Umfang bereits zerstört ist –