Ответ 1
-
Нет, деструктор по умолчанию все еще считается определяемым пользователем, поэтому он предотвратит создание операций перемещения. Также объявите операции перемещения
default
-ed, чтобы компилятор сгенерировал их. -
Вам нужно только объявить операции перемещения как
default
-ed в базовом классе. В производном классе деструктор больше не будет определяться пользователем (если вы не указали это явно), поэтому операции перемещения не будут удалены.
Итак, что бы я сделал, это следующее:
class Base
{
virtual ~Base() = default;
Base(Base&&) = default;
Base& operator=(Base&&) = default;
// probably need to think about copy operations also, as the move disables them
Base(const Base&) = default;
Base& operator=(const Base&) = default;
};
Я очень рекомендую этот разговор человеком, который внес наиболее вероятно семантику перемещения: http://www.slideshare.net/ripplelabs/howard-hinnant-accu2014
Или, если вы можете взять себя в руки, вы должны читать Пункт 17: Понять специальную функцию функции члена из превосходной книги Скотта Майерса "Эффективный современный С++". Эта проблема отлично объясняется.
PS: Думаю, вы должны немного подумать о своих базовых классах. В большинстве случаев вы должны использовать абстрактные классы, поэтому нет необходимости копировать/перемещать экземпляры из них.
PSS: Я думаю, что по умолчанию деструкторы помечены как noexcept
в С++ 11/14, поэтому явно не указывая на это, не должно быть никаких проблем:
Наследование конструкторов и неявно объявленные значения по умолчанию конструкторы, конструкторы копирования, конструкторы перемещения, деструкторы, операторы присваивания копий, операторы переадресации - все noexcept (true) по умолчанию, если только они не требуются для вызова функции это noexcept (false), и в этом случае эти функции noexcept (ложь).