Недавний вопрос (и особенно мой ответ) заставлял меня задаться вопросом:
В С++ 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
является исключением. Я что-то пропустил здесь, или это надзор в стандарте (поскольку это, по общему признанию, очень академическая ситуация)?