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

Условия автоматической генерации операций по умолчанию/копирование/перемещение ctor и копирования/перемещения?

Я хочу обновить свою память на условиях, при которых компилятор обычно автоматически создает конструктор по умолчанию, конструктор копирования и оператор присваивания.

Я вспоминаю, что были некоторые правила, но я не помню, а также не могу найти авторитетный ресурс в Интернете. Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

В дальнейшем "автоматически сгенерированный" означает "неявно объявлен как дефолт, но не определен как удаленный". Бывают ситуации, когда специальные функции-члены объявляются, но определяются как удаленные.

  • Конструктор по умолчанию автогенерируется, если нет конструктора, объявленного пользователем (§12.1/5).
  • Конструктор копирования автогенерируется, если не существует объявленного пользователем конструктора перемещения или оператора присваивания перемещения (поскольку в С++ 03 нет конструкторов перемещения или перемещения операторов присваивания, это упрощает "всегда" в С++ 03) (§12.8/8).
  • Оператор присваивания копий автогенерируется, если нет объявленного пользователем конструктора перемещения или оператора переадресации (§12.8/19).
  • Деструктор автоматически генерируется, если нет объявленного пользователем деструктора (§12.4/4).

Только С++ 11 и более поздние версии:

  • Конструктор перемещения автогенерируется, если не существует объявленного пользователем конструктора копирования, оператора присваивания копии или деструктора и если сгенерированный конструктор перемещения действителен (§12.8/10).
  • Оператор присваивания автоматически генерируется, если не существует объявленного пользователем конструктора копирования, оператора назначения копирования или деструктора и если действительный оператор присваивания перемещения действителен (например, если ему не нужно назначать постоянные члены) ( §12.8/21).

Ответ 3

С++ 17 N4659 стандартный черновик

Для быстрой перекрестной ссылки на стандарт ознакомьтесь с разделами "Неявно объявленные" следующих записей cppreference:

Эту же информацию, конечно, можно получить из стандарта. Например. на С++ 17 N4659 стандартный черновик:

15.8.1 "Копирование/перемещение конструкторов" говорит для конструктора копирования:

6 Если определение класса явно не объявляет конструктор копирования, неявный объявляется неявно. Если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленная копия конструктор определяется как удаленный; в противном случае он определяется как дефолтный (11.4). Последний случай считается устаревшим, если у класса есть пользовательский оператор копирования или пользовательский деструктор.

и для конструктора ходов:

8 Если определение класса X явно не объявляет конструктор перемещения, неявный будет неявно объявлен дефолтным, если и только если

  • (8.1) - X не имеет объявленного пользователем конструктора копирования,

  • (8,2) - X не имеет объявленного пользователем оператора копирования,

  • (8.3) - X не имеет объявленного пользователем оператора назначения перемещения, и

  • (8.4) - X не имеет объявленного пользователем деструктора.

15.8.2 "Оператор назначения копирования/перемещения" говорит о назначении копирования:

2 Если определение класса явно не объявляет оператор присваивания копии, он объявляется неявно. Если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленный оператор присваивания копии определяется как удаленный; в противном случае он определяется как дефолтный (11.4). Последний case не рекомендуется использовать, если класс имеет объявленный пользователем конструктор копирования или объявленный пользователем деструктор.

и для назначения перемещения:

4 Если определение класса X явно не объявляет оператор присваивания перемещения, он будет неявно объявлен дефолтным, если и только если

  • (4.1) - X не имеет объявленного пользователем конструктора копирования,
  • (4.2) - X не имеет объявленного пользователем конструктора перемещения,
  • (4.3) - X не имеет объявленного пользователем оператора копирования и
  • (4.4) - X не имеет объявленного пользователем деструктора.

15.4 "Деструкторы" говорят это для деструкторов:

4 Если в классе нет объявленного пользователем деструктора, деструктор неявно объявляется как дефолтный (11.4). неявно объявленный деструктор является встроенным публичным членом своего класса.