2

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

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

4

3 回答 3

1

如果一个函数可以通过异常退出,你不应该标记它 nothrownothrow是保证它永远不会通过异常退出。如果您想编写异常安全代码,那么至少有一些函数永远不会抛出(我的意思是永远不会),这一点很重要。

如果无法维护类不变量,则不应抛出异常;你所能做的就是中止这个过程。但是,不要将此与无法建立不变量的构造函数混淆;可以抛出,因为之后不会有不符合不变量的对象。此外,在某些情况下,定义一组较弱的在投掷后保持不变的不变量是有效的。说得足以保证对象可以安全地被破坏。这取决于应用程序(以及设计如何处理异常)。但是不能声明这样的函数nothrow

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

于 2015-02-26T11:32:14.690 回答
0

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

if (pt == NULL) return NULL;
// do use *pt or pt->xxx
于 2015-02-26T10:45:47.090 回答
0

如果一个函数抛出异常来报告任何问题,那么它不应该被声明noexcept。实际上,这将违反它承诺履行的合同。

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

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

于 2015-02-26T10:43:55.480 回答