В дополнение к уже полученным хорошим ответам относительно запоздалости этих правил по сравнению с тем, когда была выпущена версия vs2010,
Правила для неявно сгенерированного конструктора перемещения:
Еслиопределение класса X явно не объявляет конструктор перемещения, он будет неявно объявлен как дефолтный, если и только если
- X не имеет объявленного пользователем конструктора копирования,
- X не имеет объявленного пользователем оператора назначения копирования,
- X не имеет объявленного пользователем оператора назначения перемещения,
- X не имеет объявленного пользователем деструктора и
- конструктор перемещения не будет неявно определен как удаленный.
Правила для неявно сгенерированных операторов присваивания перемещения следуют приведенному выше шаблону.
Правила для случая, когдаконструктор копирования генерируется неявно изменилось немного!
Если определение класса не объявляет копию явноконструктор, один объявлен неявно.Если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленный конструктор копирования определяется как удаленный;в противном случае он определяется как дефолтный (8.4).Последний случай считается устаревшим, если в классе есть объявленный пользователем оператор присвоения копии или объявленный пользователем деструктор.
И аналогично для оператора присвоения копии:
Еслиопределение класса не объявляет явно оператор присваивания, один объявляется неявно.Если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленный оператор присваивания копии определяется как удаленный;в противном случае он определяется как дефолтный (8.4).Последний случай считается устаревшим, если в классе есть пользовательский конструктор копирования или деструктор, объявленный пользователем.
Итог: правило 3 теперь является правилом 5. Вы можете либо игнорировать все5 (если поведение по умолчанию работает для вас), или вам нужно продумать (и, вероятно, определить) все 5:
- конструктор копирования
- копирование назначения
- переместить конструктор
- переместить назначение
- деструктор