c++ - 一个只能由于整数溢出而失败的函数应该是noexcept吗?
问题描述
完整的问题符合标题。这是一个简单的例子:
constexpr int increment(int const value) /*noexcept?*/ {
return value + 1;
}
据我所知,noexcept
在决定是否用它标记一个函数时应该被解释为“nofail”。因此,不存在throw
ing 的可能情况不是必须考虑的唯一推理。
我没有使用 C++20,所以我的签名溢出还没有定义。:)
解决方案
据我所知, noexcept 应该被解释为“nofail”
这是不正确的。 noexcept
字面意思是“我保证这个函数永远不会抛出异常。” 还有无数其他类型的故障,例如分段错误,非法指令,纯虚函数的调用,整数除以零,更不用说“会计中的鲍勃告诉我我们所有的客户号码都是由数字组成的,但我刚刚发现我们第一个客户的 ID 实际上是 Q001,它没有解析。” 这些都不一定会导致异常,也不会导致有符号整数溢出,因此noexcept
即使它们可能失败,以这些方式失败的函数仍然可能失败——它们只是不能抛出 C++ 异常。
你可能会想,“如果一个noexcept
函数抛出异常会发生什么?” 在这种情况下,std::terminate()
将被调用,并且您的程序将结束。
推荐阅读
- android - Android 通知:小图标未与自定义图像一起显示
- python - 为什么除非将 gui 拖到更宽/更大的尺寸,否则 Tkinter 框架不会显示所有三个按钮
- java - 两个不同 LocalContainerEntityManagerFactoryBean 上的 @PersistenceContext 抛出 TransactionRequiredException
- javascript - 如何防止用户通过PayPal购买产品时更改html?
- python - 在 Python 中读取 SendGrid 邮件对象
- flutter - 如何在颤动中显示AppBar下方的警报栏
- sql - 检查数据库中的值是否可用
- python - 如何在python中计算回归误差?
- ios - 如何在swift中找到其他类中的类实例名称?
- xml - 如何根据 Azure Logic App 中的节点名称更新 XML 节点值并删除 XML 节点