2016-11-19 2 views
0

Это то, что я сделал изначально.удаление const в экземпляре копии

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) 

Однако, если класс А немного изменен следующим образом (удалить сопзЬ в конструктор копирования), поэтому есть ошибка компиляции для последней строки? спасибо

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

временный объект будет уничтожен в строке, которую он создал, поэтому компилятор думает, что вы измените его, когда вы передадите его как ссылку не const (существует возможность, которую вы будете изменять, когда вы передаете не const-ссылку) , но его изменение является незаконным, поскольку оно уже уничтожено в этом объеме –

ответ

4
A a4 = 123; 

эквивалентно

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

Это работает в первом случае, так как есть конструктор, который принимает A const& как тип аргумента.

Это не работает, если тип аргумента A&. Временный объект может использоваться, когда тип аргумента равен A const&, а не когда он равен A&.

1

Для случая A a4 = 123;, когда объект «а4» ведется строительство, утверждение

A a4 = 123;

разрушенный компилятором, как

A a4 = A(123);

В выше заявлении, один аргумент, то есть A(int) используется для преобразования целочисленного значения «123» во временный объект &, что временный объект скопирован на объект «a4», используя конструктор копирования. C++ не позволяет передавать временные объекты по неконстантной ссылке. Поэтому, когда вы удаляете const из конструктора копирования, он заставляет компилятор давать ошибку.