Подтвердить что ты не робот

Условия, при которых компилятор не будет определять implicits (конструктор, деструктор, конструктор копирования, назначение копии)

Это должно быть тривиальным вопросом, но я не смог найти его явно в stackoverflow.

Ниже будет указано неявно, если не предоставлено пользователем.

  • конструктор default (без параметров)
  • конструктор копирования Оператор присваивания
  • деструктор

Но я где-то читал (что, по-видимому, не могу найти сейчас), что есть некоторые условия, когда компилятор не будет имплицитно реализовывать их.

Что это за условия?

4b9b3361

Ответ 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 a operator=, принимающего 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;