为什么std :: exception析构函数不是noexcept

时间:2018-04-25 15:16:51

标签: c++ exception destructor

C ++ 11 destructor基类的std::exception不是noexcept,因此可能(理论上)抛出异常,因此对其所有派生的放宽权限课程(包括std::bad_allocstd::runtime_error)。但是,C ++ 98 std::exception的析构函数有一个throw()异常规范,表明不允许抛出异常。为什么不同?为什么现在允许抛出异常?鉴于std::exception constructors现在是noexcept,权限特别奇怪:您可以安全地构造这样的对象,但是您无法安全地销毁它:与正常行为相反。< / p>

让异常类的析构函数抛出异常通常是灾难性的。什么可能导致std::exception::~exception抛出异常?

2 个答案:

答案 0 :(得分:6)

确实是noexcept(true)。从C ++ 11开始,对于没有明确提供异常规范的destructors,异常规范被认为是noexcept(true)

  

除非明确提供没有异常规范,否则异常规范被认为是隐式声明的析构函数将使用的规范(见下文)。在大多数情况下,这是noexcept(true)。因此,必须显式声明抛出析构函数noexcept(false)。 (自C ++ 11起)

答案 1 :(得分:1)

[res.on.exception.handling]/3

  

C ++标准库中定义的析构函数操作不应抛出异常。 C ++标准库中的每个析构函数都应该表现得好像它具有非抛出异常规范。