在gcc或clang中启用警告,当一个noexcept函数试图调用非noexcept函数

5

在GCC或Clang中是否有标志,当一个标记为noexcept的函数试图调用一个未被标记为noexcept的函数时,会抛出编译时错误(或警告)?

如果没有,那么当您从以前标记为noexcept的函数中删除noexcept时,该代码的哪些部分受到影响怎么办?难道没有任何方法吗?


你应该如何确定在从之前标记为noexcept的函数中删除noexcept时,哪些部分的代码会受到影响?- 你需要非常仔细地审查你的代码。 - Jesper Juhl
1个回答

3
标记一个函数为noexcept即使被调用的函数没有标记也有意义。以平方根为例,如果传入一个负数可能会抛出异常。当在一个确保只使用正数调用的函数中使用它时,可以将其标记。同样的,如果捕获异常也是如此。
话虽如此,有一个工具来标记可疑的调用是有意义的。我知道clang有一个编译器警告,如果从一个noexcept函数(直接)抛出异常。(参见https://clang.llvm.org/docs/DiagnosticsReference.html#wexceptions) 对于我的自定义assert宏,在constexpr中工作,我已经禁止了它,MSVC也一样。
对于间接情况,即调用未标记的函数,我还没有看到编译器警告。我知道clangd报告了这个问题,很可能是因为clang-tidy。快速检查它的页面让我相信它正在遵循以下检查: https://clang.llvm.org/extra/clang-tidy/checks/bugprone/exception-escape.html

我不能确定GCC,因为我不太常用它。


你可以使用 reinterpret_cast() 来将一个非 noexcept 函数转换为 noexcept 函数,但需要在显式检查要求后进行。这样,(间接的)编译器检查仍然有效。 - darkdragon
LLVM的工作链接:https://clang.llvm.org/extra/clang-tidy/checks/bugprone/exception-escape.html - PolyGlot
谢谢@polyglot,我已经更新了URL。看起来他们重新整理了他们的文档。 - JVApen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接