Правила автоматического создания специальных функций перемещения (оператор конструктора и присваивания) в С++ 11 указывают, что деструктор не может быть объявлен. Логика, по-видимому, состоит в том, что если вам нужно сделать что-то особенное в уничтожении, это может не быть безопасным.
Однако для правильных вызовов деструктора в полиморфизме необходимо объявить деструктор базовых классов как виртуальный (иначе удаление экземпляра подкласса с помощью указателя его базового класса не приведет к надлежащей цепочке деструктора).
Я предполагаю, что даже пустой деструктор не позволит компилятору автоматически генерировать специальные функции перемещения. Как в:
class Base {
virtual ~Base() { }
};
Однако вы можете установить деструктор по умолчанию:
class Base {
virtual ~Base() = default;
}
Итак, вопрос 1: позволит ли это компилятору автоматически генерировать специальные функции перемещения?
Однако существует проблема с явным деструктором по умолчанию. По крайней мере, в случае GCC 4.8.2 подпись неявно изменяется на noexcept. Как в:
class Base {
virtual ~Base() = default; // compiler changes to:
// virtual ~Base() noexcept;
}
Пока у меня нет проблем с noexcept в деструкторе, это сломает следующий "клиентский" код:
class Sub : public Base {
virtual ~Sub(); // this declaration is now "looser" because of no noexcept
}
Итак, вопрос 2 более подходит: есть ли способ разрешить автоматическую генерацию специальных функций перемещения в С++ 11 и обеспечить правильную цепочку деструкторов для подклассов (как описано выше), все без нарушения подкласса ( "клиент" ")?