在C ++中,如果方法可能因为不保持类的不变量而抛出,我应该标记它noexcept
吗?
例如,列表具有指向链接的指针,该指针应该是nullptr
或正确的指针,并且方法取消引用此指针。它是否阻止使用noexcept
?
答案 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