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

标签 c++ noexcept

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

例如:

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

最佳答案

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

但是想一想:clang-tidy 怎么可能知道 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);

关于c++ - 浮点乘法可以在 C++ 中抛出异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50900302/

相关文章:

c++ - 为什么以下代码不会导致 move 对象而不是复制?

c++ - std::chrono::steady_clock::now 应该是 noexcept 吗?

c++ - 析构函数向后兼容 noexcept(false)

c++ - 为什么 noexcept 说明符不在声明的方法范围内?

c++ - 从不将涉及动态内存分配的函数注释为 noexcept?

c++ - 将现有的 C++ openGL 项目从 glut/freeglut 转换为 glfw

C++ 如何遍历对象的 std::vector 并在控制台上显示内容

c++ - “Default member initializer needed within definition of enclosing class outside of member functions” - 我的代码格式不正确吗?

c++ - Com口写读方法

C++ 如何调试由另一个进程生成的进程