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

Pet*_*ano 7 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
Run Code Online (Sandbox Code Playgroud)

idm*_*ean 5

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

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

因此,铛,整洁有两种选择:它可以做昂贵(可能是不确定的)控制流分析,也可以简单地依靠你正确地宣布nothrow,它确实:

  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);
Run Code Online (Sandbox Code Playgroud)


Pet*_*ker 3

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

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