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!

Это невозможно, и произойдет бесконечная рекурсия.

Конструктор создает новый объект; оператор присваивания изменяет существующий объект. Вы не можете использовать оператор присваивания для создания нового объекта: он не знает, как это сделать, даже если кажется, что он работает в простых случаях.

Другие вопросы по тегам