C++: назначение копирования вызова в конструкторе копирования
Хорошо, я читаю "эффективный C++", и в пункте 12 говорится, пожалуйста, не вызывайте назначение копирования в конструкторе копирования. Но после того, как я попытаюсь это сделать, он работает. Поэтому я хочу спросить, почему я не могу повторно использовать код назначения копирования в конструкторе копирования?
2 ответа
Предположим, вы используете оператор копирования-присваивания в конструкторе копирования. Тогда вы теряете возможность реализовать идиому копирования и замены для оператора присваивания:
struct A
{
A (const A &a)
{
*this = a; // Assignment to a not yet constructed object is not well
}
A &operator=(A a) // Pass by value
{
// ...
}
};
A a1, a2;
a1 = a2; // Infinite recursion!
Это невозможно, и произойдет бесконечная рекурсия.
Конструктор создает новый объект; оператор присваивания изменяет существующий объект. Вы не можете использовать оператор присваивания для создания нового объекта: он не знает, как это сделать, даже если кажется, что он работает в простых случаях.