Проблема с конструктором копирования и оператором копирования-присваивания заключается в том, что компилятор автоматически генерирует реализации, если они явно не объявлены.
Это может привести к непредвиденным проблемам. Если класс имеет нетривиальный деструктор, он почти всегда должен предоставлять свои собственные реализации для конструктора копирования и оператора присваивания копий (это Law of the Big Three), поскольку созданные по умолчанию компиляторы, как правило, будут делать неправильные вещи.
Нарушение Закона Большой тройки часто приводит к ошибкам, таким как двойное освобождение членов данных и повреждение памяти. Это не редкость для возникновения таких ошибок, потому что автор класса никогда не думал о том, как работает копирование, и потому, что пользователям легко скопировать объекты непреднамеренно.
Если автор класса не подумал о том, как правильно копировать экземпляры этого класса (или если у класса нет тривиального деструктора), то лучше явно запретить копирование, чтобы избежать потенциальных проблем. Внедрение возможности перераспределения может быть отложено до фактической потребности в ней.
Они называются «конструктор копирования» и «оператор присваивания». Нет такой конструкции, как конструктор присваивания. – Sjoerd
Я бы назвал их «конструктором» и «оператором присваивания» или «конструктором копирования» и «оператором присваивания копий». –
Я бы не назвал ЗЛО, что-то вроде их плохого цвета. Просто отключите их, например, boost: boost :: noncopyable –