2016-11-19 3 views
0

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 
+0

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 –

Antwort

4
A a4 = 123; 

ist

A a4 = A(123); // The RHS is a temporary A object. 

zu

Äquivalent, die für den ersten Fall arbeitet seit ein Konstruktor ist, die eine A const& als Argument Typ nimmt.

Das funktioniert nicht, wenn der Argumenttyp A& ist. Ein temporäres Objekt kann verwendet werden, wenn der Argumenttyp A const& ist, nicht wenn es A& ist.

1

Für den Fall A a4 = 123;, wenn das Objekt „a4“ konstruiert wird, wird die Anweisung

A a4 = 123;

gebrochen wird ein vom Compiler als

A a4 = A(123);

In obiger Aussage, nach unten argument constructor ie A(int) wird verwendet, um den ganzzahligen Wert "123" in ein temporäres Objekt & dieses temporäre Objekt zu konvertieren mit dem Kopierkonstruktor in das Objekt "a4" kopiert. C++ erlaubt nicht, temporäre Objekte durch nicht-konstante Referenz zu übergeben. Wenn Sie also const vom Kopierkonstruktor entfernen, verursacht der Compiler einen Fehler.

Verwandte Themen