Недавний вопрос (и особенно мой ответ) заставлял меня задаться вопросом:
В С++ 11 (и более новые стандарты) деструкторы всегда неявно не noexcept, если не указано иное (т.е. noexcept(false)). В этом случае эти деструкторы могут легально отбрасывать исключения. (Заметим, что это все равно, что вы действительно должны знать, что вы делаете, - такая ситуация!)
Тем не менее, все перегрузки std::unique_ptr<T>::reset() объявляются всегда noexcept (см. Cppreference), даже если деструктор, если T нет, что приводит к завершению программы, если деструктор генерирует исключение во время reset(). Аналогичные действия применимы к std::shared_ptr<T>::reset().
Почему reset() всегда noexcept, а не условно noexcept?
Должно быть возможно объявить его noexcept(noexcept(std::declval<T>().~T())) что делает его неслучайным, если деструктор T является исключением. Я что-то пропустил здесь, или это надзор в стандарте (поскольку это, по общему признанию, очень академическая ситуация)?