Неявный конструктор перемещения не (только) удален , он не объявлен в первую очередь, когда у вас есть объявленный пользователем деструктор, как в случае с Base1
и Base2
.
Поэтому конструктор перемещения никогда не может рассматриваться в разрешении перегрузки, поэтому auto obj1 = std::move(c1);
, в то время как он может вызывать конструктор перемещения Child1
, должен вернуться к копированию конструкции для Base1
подобъект.
Неявно объявленные конструкторы копирования как Base1
, так и Child1
определены как удаленные, поскольку неявно объявленный конструктор копирования Data
определен как удаленный, поскольку Data
имеет пользовательский конструктор перемещения. Поэтому auto obj1 = std::move(c1);
завершится с ошибкой, что неявно объявленный конструктор копирования будет удален.
Для Base2
конструктор копирования не определен как удаленный, поскольку он не имеет члена Data
и поэтому auto obj2 = std::move(c2);
вызовет конструктор перемещения Child2
(который также использует конструктор перемещения Data
), но использует конструктор копирования для подобъекта Base2
.