【发布时间】:2018-07-29 10:01:36
【问题描述】:
A recent question(尤其是我的回答)让我想知道:
在 C++11(和更新的标准)中,析构函数总是隐含的noexcept,除非另有说明(即noexcept(false))。在这种情况下,这些析构函数可以合法地抛出异常。 (请注意,这仍然是一种你应该真正知道你在做什么——那种情况!)
但是,所有的重载
std::unique_ptr<T>::reset() 被声明为始终为noexcept(参见cppreference),即使T 的析构函数不是,如果析构函数在reset() 期间抛出异常,则会导致程序终止。类似的事情也适用于std::shared_ptr<T>::reset()。
为什么reset()总是noexcept,而不是有条件的noexcept?
如果T 的析构函数是noexcept,则应该可以将其声明为noexcept(noexcept(std::declval<T>().~T())),从而使其成为noexcept。我是否在这里遗漏了什么,或者这是对标准的疏忽(因为这无疑是一个高度学术化的情况)?
【问题讨论】:
标签: c++ c++11 language-lawyer destructor noexcept