Редактировать: В C ++ 11 это сложнее, чем объявлено неявно или нет. Они могут быть либо неявно объявлены и по умолчанию, неявно объявлены и удалены, либо необъявленные. Прочитайте это , чтобы различить последние 2. Следующая информация не совсем верна, поскольку она не различает объявленные и удаленные и необъявленные.
Ниже идет работа. (?)
означает, что я хотел бы уточнить или дать количественную оценку утверждению.
Специальные функции-члены §12 / 1
Реализация будет неявно объявлять эти функции-члены для некоторых типов классов, когда пользователь явно не объявляет их:
- конструктор по умолчанию
- конструктор копирования
- оператор присваивания копии
- Переместить конструктор
- оператор назначения перемещения
- деструктор
Специальная функция-член НЕ будет неявно объявлена, если тип имеет ...
Конструктор по умолчанию §12.1 / 5
Конструктор копирования §12.8 / 8, §12.8 / 12
- объявленный пользователем конструктор перемещения
- объявленный пользователем оператор назначения перемещения
- элемент нестатических данных ссылочного типа rvalue
- вариант-член с нетривиальным конструктором копирования и являющийся объединяющим классом (?)
- нестатический элемент данных типа (или его массива), который не может быть скопирован
- прямой или виртуальный базовый класс без конструктора доступных копий
* Такое неявное объявление не рекомендуется, если в классе есть пользовательский оператор копирования или пользовательский деструктор (?)
Оператор назначения копирования §12.8 / 19, §12.8 / 24
- объявленный пользователем конструктор перемещения
- объявленный пользователем оператор назначения перемещения
- вариантный член с нетривиальным оператором присваивания копии, являющийся объединяющим классом (?)
- элемент нестатических данных const, не относящийся к классу (или его массив)
- нестатический элемент данных ссылочного типа
- элемент нестатических данных с оператором недоступного копирования
- прямой или виртуальный базовый класс с оператором назначения недоступных копий
* Такое неявное объявление не рекомендуется, если в классе есть пользовательский конструктор копирования или пользовательский деструктор (?)
Конструктор Move §12.8 / 10, §12.8 / 12
- конструктор копирования, объявленный пользователем
- заявленный пользователем оператор присвоения копии
- объявленный пользователем оператор присваивания перемещения
- деструктор, объявленный пользователем
- Конструктор перемещения не будет неявно определен как удаленный (?)
- вариант-член с нетривиальным конструктором перемещения и является объединенным классом (?)
- нестатический элемент данных типа (или его массива), который не может быть перемещен
- нестатический член данных или прямой или виртуальный базовый класс с типом, который не имеет конструктора перемещения и не может быть легко скопирован
- прямой или виртуальный базовый класс без доступного конструктора перемещения
Оператор назначения перемещения §12.8 / 21, §12.8 / 24
- конструктор копирования, объявленный пользователем
- объявленный пользователем конструктор перемещения
- объявленный пользователем оператор присвоения копии
- деструктор, объявленный пользователем
- оператор присваивания перемещения не будет неявно определен как удаленный (?)
- вариантный член с нетривиальным оператором присваивания перемещения и является объединяющим классом (?)
- элемент нестатических данных типа const, не относящегося к классу (или его массив)
- нестатический элемент данных ссылочного типа
- нестатический элемент данных с недоступным оператором назначения перемещения и не может быть просто скопирован
- прямой или виртуальный базовый класс с недоступным оператором присваивания перемещений, который не может быть просто скопирован
Destructor §12.4 / 4