不变量和noexcept

时间:2015-02-26 10:25:19

标签: c++ invariants noexcept

在C ++中,如果方法可能因为不保持类的不变量而抛出,我应该标记它noexcept吗?

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

3 个答案:

答案 0 :(得分:1)

如果函数可以通过异常退出,则不应标记它 nothrow; nothrow保证永远不会通过 例外。必须至少有一些功能 如果你想编写异常安全代码,永远不要抛出(我的意思是永远)。

如果无法维护类不变量,则不应该抛出 例外;你可以理所当然地做的就是中止这个过程。唐'吨 把它与一个无法建立不变量的构造函数混淆, 然而;因为没有任何对象,所以扔掉它就好了 之后,它不符合不变量。还有,在某些情况下 在这种情况下,定义一组较弱的不变量是有效的 投掷。说得足以保证对象可以安全 自毁。这取决于应用程序(以及设计如何处理 例外)。但是这些函数不能声明为nothrow

关于你的具体例子:如果不变量是a 正确的指针或空指针,没有办法测试这个并得到一个 异常无论如何。如果指针无效(不指向有效指针) 类型的对象,并且不是空的),那么你有未定义的行为。 任何事情都可能发生,而且在真实系统上,如果你发生了任何事情 取消引用指针。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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