Конструктор копирования по умолчанию не будет сгенерирован компилятором автоматически в следующих ситуациях:
class MyClass {
public:
MyClass(const MyClass& other) { /* пользовательская реализация */ }
// Теперь компилятор не сгенерирует конструктор копирования по умолчанию
};
class NonCopyable {
std::mutex mtx; // mutex нельзя копировать
// Конструктор копирования не будет сгенерирован
};
class MoveOnly {
public:
MoveOnly(MoveOnly&&) noexcept; // Определен move-конструктор
// Конструктор копирования не сгенерируется
};
class RefHolder {
int& ref; // Ссылка не может быть перепривязана
// Конструктор копирования не сгенерируется
};
class Base {
Base(const Base&) = delete;
};
class Derived : public Base {
// Конструктор копирования не сгенерируется
};
class VirtualBase {};
class Derived : virtual public VirtualBase {
// Конструктор копирования не сгенерируется автоматически
};
class NoCopy {
NoCopy(const NoCopy&) = delete;
};
class ConstMember {
const int value;
// Конструктор копирования не сгенерируется
};
#include <type_traits>
static_assert(std::is_copy_constructible_v<MyClass>,
"MyClass should be copy constructible");
Конструктор копирования не генерируется автоматически, когда:
Понимание этих правил помогает проектировать классы с корректным поведением при копировании и избегать неожиданных ошибок компиляции.