浮点乘法可以在C ++中抛出异常吗?

时间:2018-06-17 20:39:15

标签: c++ noexcept

这可能吗?我不认为是,但我不知道这是标准会说的,还是它的实施定义?我问,因为我想知道是否安全或者值得标记一个constexpr函数,比如noexcept

EX:

constexpr double to_meters(double y) noexcept? {
  return y * 10;
}
constexpr double x = to_meters(y); // Clang-Tidy warns about possible exception without noexcept

3 个答案:

答案 0 :(得分:5)

不,浮点乘法通常不会抛出C ++异常。

但请想一想:铿锵有可能知道to_meter是否会抛出异常?在C ++中,除非明确声明不抛出异常,否则每个函数都会抛出异常。

所以clang-tidy有两个选择:它可以做昂贵的(可能是不确定的)控制流分析,或者只是依靠你正确地声明nothrowwhich it does

  Finder->addMatcher(
      varDecl(anyOf(hasThreadStorageDuration(), hasStaticStorageDuration()),
              unless(hasAncestor(functionDecl())),
              anyOf(hasDescendant(cxxConstructExpr(hasDeclaration(
                        cxxConstructorDecl(unless(isNoThrow())).bind("func")))),
                                         //^^^^^^^^^^^^^^^^^^^
                    hasDescendant(cxxNewExpr(hasDeclaration(
                        functionDecl(unless(isNoThrow())).bind("func")))),
                                    //^^^^^^^^^^^^^^^^^^^
                    hasDescendant(callExpr(hasDeclaration(
                        functionDecl(unless(isNoThrow())).bind("func"))))))
          .bind("var"),
      this);

答案 1 :(得分:3)

语言定义在这里没有给你任何保证,但是因为几乎每个实现(也就是说,我都不知道)没有实现IEEE-754数学,它不会抛出异常,所以不是我担心。更一般地说,抛出异常的浮点数学包必须用C ++编写;这是非常不可能的。

但是,当发生引发“浮点异常”的浮点错误时,您可能会收到消息;这是一个浮点异常,而不是 C ++ 异常,它与C ++异常无关。这是一个运行时错误,具有一个特殊的名称。

答案 2 :(得分:0)

算术不能在C ++中引发异常。通常需要注意的是,如果代码导致未定义的行为,那么任何事情都可能发生。因此,您可以将您的功能标记为noexcept

如果结果超出范围,浮点乘法可能会导致未定义的行为。

“浮点异常”是不会中断程序的标志:您必须使用std::fetestexcept测试它们,然后您可以决定要做什么。可以通过浮点乘法来提升FE_ flags listed here中的几个。