Это то, что я сделал изначально.удаление 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
временный объект будет уничтожен в строке, которую он создал, поэтому компилятор думает, что вы измените его, когда вы передадите его как ссылку не const (существует возможность, которую вы будете изменять, когда вы передаете не const-ссылку) , но его изменение является незаконным, поскольку оно уже уничтожено в этом объеме –