Условия для автоматической генерации оператора по умолчанию / копирования / перемещения ctor и оператора копирования / перемещения? - PullRequest
115 голосов
/ 09 февраля 2011

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

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

Ответы [ 3 ]

126 голосов
/ 09 февраля 2011

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

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

C ++ 11 и более поздних версий:

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

Диаграмма ниже очень полезна.

C++ rules for automatic constructors and assignment operators из Липкие биты - стать правилом нулевого героя

1 голос

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

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

Та же информация может, конечно,получить из стандарта.Например, C ++ 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).Последний случай считается устаревшим, если в классе имеется объявленный пользователем конструктор копирования или объявленный пользователем деструктор.

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

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

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

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

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

...