首页 > 解决方案 > 一个只能由于整数溢出而失败的函数应该是noexcept吗?

问题描述

完整的问题符合标题。这是一个简单的例子:

constexpr int increment(int const value) /*noexcept?*/ {
  return value + 1;
}

据我所知,noexcept在决定是否用它标记一个函数时应该被解释为“nofail”。因此,不存在throwing 的可能情况不是必须考虑的唯一推理。

我没有使用 C++20,所以我的签名溢出还没有定义。:)

标签: c++c++17integer-overflownoexcept

解决方案


据我所知, noexcept 应该被解释为“nofail”

这是不正确的。 noexcept字面意思是“我保证这个函数永远不会抛出异常。” 还有无数其他类型的故障,例如分段错误,非法指令,纯虚函数的调用,整数除以零,更不用说“会计中的鲍勃告诉我我们所有的客户号码都是由数字组成的,但我刚刚发现我们第一个客户的 ID 实际上是 Q001,它没有解析。” 这些都不一定会导致异常,也不会导致有符号整数溢出,因此noexcept即使它们可能失败,以这些方式失败的函数仍然可能失败——它们只是不能抛出 C++ 异常。

你可能会想,“如果一个noexcept函数抛出异常会发生什么?” 在这种情况下,std::terminate()将被调用,并且您的程序将结束。


推荐阅读