不变量和noexcept
Invariants and noexcept
在C++中,如果一个方法可能只是因为没有维护类的不变量而抛出,我应该将其标记为noexcept
吗?
例如,列表有一个指向链接的指针,该指针应该是nullptr
或正确的指针,并且方法取消引用该指针。它是否阻止使用noexcept
?
如果函数可以通过异常退出,则不应标记它nothrow
;nothrow
保证其永远不会通过例外至关重要的是,至少有几个功能如果你想写异常安全的代码,就永远不要抛出(我的意思是永远不要)。
如果不能维护类不变量,则不应该抛出例外你所能合理地做的就是中止这个过程。不要将其与不能建立不变量的构造函数混淆,然而那就扔吧,因为不会有物体之后不符合不变量。此外,在某些情况下在这种情况下,定义一组较弱的不变量是有效的投掷。说得恰到好处,以保证对象可以安全已销毁。这取决于应用程序(以及设计如何处理例外情况)。但是这样的函数不能被声明为nothrow
。
关于你的具体例子:如果不变量是正确的指针或空指针,没有方法对此进行测试并获得无论如何都是例外。如果指针无效(不指向有效的类型的对象,并且不是null),则您有未定义的行为。任何事情都可能发生,在真实的系统中,如果你取消引用指针。
如果函数抛出异常以报告任何问题,则不应将其声明为noexcept
。这实际上违反了它承诺履行的合同。
无论是否抛出异常,对象保持其不变也是一种很好的做法。通常的做法是,所有构造函数都建立一个不变量,所有其他成员函数都保持该不变量,直到对象被销毁(并调用析构函数)。
如果函数取消引用nullptr
,则其行为是未定义的。不需要抛出异常。
如果一个方法在取消引用空指针时可以引发异常,则不应将其标记为noexcept
。如果你真的希望它是noexcept
,你应该在取消引用之前测试指向null的指针(并返回一个特殊值)
if (pt == NULL) return NULL;
// do use *pt or pt->xxx
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 访问类成员而不复制此变量或互斥变量
- 使用不变量来确定二分搜索中的边界条件
- C++变量等于不变量
- 有没有一种通用的方法来实现不变量
- 未能优化看似明显的循环不变量(但volatile限定符发挥了神奇的作用)
- 了解循环不变量
- 在嵌套循环/循环不变量中检查一次
- 不变量和noexcept
- 一旦引入旋转/比例不变量,OpenCV Orb就无法找到匹配项
- 如何在不重新建立堆不变量的情况下有效地替换堆的顶部元素
- opencvc++模板/模式匹配缩放和旋转不变量
- 带不变量的快速类int类型?c++
- 在元编程中强制执行不变量