Ответ 1
Constuctor по умолчанию (например, X()
) не будет неявно сгенерирован, если:
- вы явно объявили какой-либо конструктор вообще
- существует элемент данных, который не является конструктивным по умолчанию (например, ссылка, объект
const
или класс с отсутствующим или недоступным конструктором по умолчанию) - (С++ 11) вы явно сказали компилятору не генерировать один, используя
X() = delete;
Конструктор копирования (например, X(const X&)
) не будет неявно сгенерирован, если:
- вы явно объявили конструктор копирования (для класса
X
конструктор, принимающийX
,X&
илиconst X&
) - имеется элемент данных, который не является конструктивным (например, класс без или недоступного конструктора копирования)
- базовый класс не является конструктивным для копирования
- (С++ 11) вы объявили конструктор перемещения или переместите оператор присваивания
- (С++ 11), вы явно сказали компилятору не генерировать один, используя
X(const X&) = delete;
Оператор присваивания копий (например, X& operator=(const X&)
) не будет неявно сгенерирован, если:
- вы явно объявили оператор присваивания копии (для класса
X
aoperator=
, принимающегоX
,X&
илиconst X&
) - в вашем классе есть элемент данных, который не может быть назначен для копирования (например, ссылка, объект
const
или класс без оператора или без права доступа) - базовый класс не может быть назначен для копирования
- (С++ 11) вы объявили конструктор перемещения или переместите оператор присваивания
- (С++ 11), вы явно сказали компилятору не генерировать один, используя
X& operator=(const X&) = delete;
Деструктор (например, ~X()
) не будет неявно сгенерирован, если:
- вы явно объявили деструктор
- (С++ 11), вы явно сказали компилятору не генерировать один, используя
~X() = delete;
Конструктор Move (С++ 11) (например, X(X&&)
) не будет неявным образом если:
- вы явно объявили конструктор перемещения (для класса
X
, конструктор, принимающийX&&
) - вы объявили оператор присваивания копий, конструктор копирования, деструктор или оператор присваивания перемещения
- в вашем классе есть элемент данных, который не может быть сконструирован по ходу (
const
, является ссылкой или имеет удаленный, недоступный или неоднозначный конструктор перемещения) - базовый класс не может быть построен по ходу движения
- вы явно сказали компилятору не генерировать один, используя
X(X&&) = delete;
Оператор присваивания перемещения (С++ 11) (например, X& operator=(X&&)
) не будет неявно сгенерированный, если:
- вы явно объявили оператор присваивания перемещения (для класса
X
,operator=
, принимающегоX&&
) - вы объявили оператор присваивания копии, конструктор копирования, деструктор или конструктор перемещения
- в вашем классе есть элемент данных, который нельзя назначить переносом (это
const
, является ссылкой или имеет удаленный, недоступный или неоднозначный оператор присваивания перемещения) - базовый класс не может быть назначен переносом
- вы явно сказали компилятору не генерировать один, используя
X& operator=(X&&) = delete;