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


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

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

2 94

2 ответа:

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

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

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

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

Я нашел диаграмму ниже очень полезной.

C++ rules for automatic constructors and assignment operators от Sticky Bits-становится правилом нулевого Героя