c 11 std::exception
基类的破坏者不是 noexcept
,因此(从理论上讲(可能会抛出一个例外,因此,它对所有派生的类别(包括 std::bad_alloc
(进行了放松的许可和std::runtime_error
(。然而,C 98 std::exception
的驱动器具有throw()
例外规范,表明不允许抛出异常。为什么有区别?为什么现在允许抛出异常?鉴于std::exception
构造函数现在是noexcept
:您可以安全地构造这样的对象,但是您不能安全地销毁它:
让异常班级的破坏者抛出一个例外通常是灾难性的。什么会导致std::exception::~exception
抛出异常?
确实是 noexcept(true)
。由于C 11,对于没有例外规范的破坏者,如果例外规范被认为是noexcept(true)
。
除非明确提供了不例外规范,
除外,异常规范被认为是由隐式宣布的破坏者使用的(见下文(。在大多数情况下,这是
noexcept(true)
。因此,必须明确声明抛出攻击子noexcept(false)
。(由于C 11(
[res.on.exception.handling]/3:
在C 标准库中定义的驱动器操作不得抛出例外。C 标准库中的每个破坏者都应表现得像其非临时例外规范一样。