为什么std ::异常驱动器不否



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 标准库中的每个破坏者都应表现得像其非临时例外规范一样。

最新更新