C ++ 11 destructor基类的std::exception
不是noexcept
,因此可能(理论上)抛出异常,因此对其所有派生的放宽权限课程(包括std::bad_alloc
和std::runtime_error
)。但是,C ++ 98 std::exception
的析构函数有一个throw()
异常规范,表明不允许抛出异常。为什么不同?为什么现在允许抛出异常?鉴于std::exception
constructors现在是noexcept
,权限特别奇怪:您可以安全地构造这样的对象,但是您无法安全地销毁它:与正常行为相反。< / p>
让异常类的析构函数抛出异常通常是灾难性的。什么可能导致std::exception::~exception
抛出异常?
答案 0 :(得分:6)
确实是noexcept(true)
。从C ++ 11开始,对于没有明确提供异常规范的destructors,异常规范被认为是noexcept(true)
。
除非明确提供没有异常规范,否则异常规范被认为是隐式声明的析构函数将使用的规范(见下文)。在大多数情况下,这是
noexcept(true)
。因此,必须显式声明抛出析构函数noexcept(false)
。 (自C ++ 11起)
答案 1 :(得分:1)
[res.on.exception.handling]/3:
C ++标准库中定义的析构函数操作不应抛出异常。 C ++标准库中的每个析构函数都应该表现得好像它具有非抛出异常规范。