不变量和noexcept

Invariants and noexcept

本文关键字:noexcept 不变量      更新时间:2023-10-16

在C++中,如果一个方法可能只是因为没有维护类的不变量而抛出,我应该将其标记为noexcept吗?

例如,列表有一个指向链接的指针,该指针应该是nullptr或正确的指针,并且方法取消引用该指针。它是否阻止使用noexcept

如果函数可以通过异常退出,则不应标记它nothrownothrow保证其永远不会通过例外至关重要的是,至少有几个功能如果你想写异常安全的代码,就永远不要抛出(我的意思是永远不要)。

如果不能维护类不变量,则不应该抛出例外你所能合理地做的就是中止这个过程。不要将其与不能建立不变量的构造函数混淆,然而那就扔吧,因为不会有物体之后不符合不变量。此外,在某些情况下在这种情况下,定义一组较弱的不变量是有效的投掷。说得恰到好处,以保证对象可以安全已销毁。这取决于应用程序(以及设计如何处理例外情况)。但是这样的函数不能被声明为nothrow

关于你的具体例子:如果不变量是正确的指针或空指针,没有方法对此进行测试并获得无论如何都是例外。如果指针无效(不指向有效的类型的对象,并且不是null),则您有未定义的行为。任何事情都可能发生,在真实的系统中,如果你取消引用指针。

如果函数抛出异常以报告任何问题,则不应将其声明为noexcept。这实际上违反了它承诺履行的合同。

无论是否抛出异常,对象保持其不变也是一种很好的做法。通常的做法是,所有构造函数都建立一个不变量,所有其他成员函数都保持该不变量,直到对象被销毁(并调用析构函数)。

如果函数取消引用nullptr,则其行为是未定义的。不需要抛出异常。

如果一个方法在取消引用空指针时可以引发异常,则不应将其标记为noexcept。如果你真的希望它是noexcept,你应该在取消引用之前测试指向null的指针(并返回一个特殊值)

if (pt == NULL) return NULL;
// do use *pt or pt->xxx