Делайте деструкторы `noexcept`
Причина
Деструктор не должен завершаться с ошибкой. Если деструктор пытается выйти с исключением — это серьёзная ошибка дизайна, и программе лучше завершиться.
Примечание
Деструктор (пользовательский или сгенерированный компилятором) неявно объявляется noexcept (независимо от кода в его теле), если все члены его класса имеют noexcept-деструкторы. Явно помечая деструкторы как noexcept, автор защищается от того, что деструктор станет неявно noexcept(false) при добавлении или изменении члена класса.
Пример
Не все деструкторы по умолчанию являются noexcept; один выбрасывающий член отравляет всю иерархию классов
struct X {
Details x; // имеет выбрасывающий деструктор
// ...
~X() { } // неявно noexcept(false); т.е. может выбросить
};
Поэтому в случае сомнений объявляйте деструктор noexcept.
Примечание
Почему же не объявлять все деструкторы noexcept? Потому что во многих случаях — особенно в простых — это было бы лишним загромождением.
Контроль
(Простой) Деструктор должен быть объявлен noexcept, если он может выбросить исключение.
C.ctor: Конструкторы
Конструктор определяет, как инициализируется (конструируется) объект.