c++ - 关于静态全局 lambda 变量的错误 clang-tidy 警告?

标签 c++ lambda clang-tidy

提供以下代码,在全局范围内,clang-tidy 不给出警告:

auto test = []{};

但是,当执行以下操作时,它会:

#include <tuple>

auto test = []{
    std::tuple t{1, 2, 3};
};
<source>:3:6: warning: initialization of 'test' with static storage duration may throw an exception that cannot be caught [cert-err58-cpp]
auto test = []{
     ^

/opt/compiler-explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../include/c++/8.2.0/tuple:646:19: note: possibly throwing constructor declared here
        constexpr tuple(_UElements&&... __elements)
                  ^

将 lambda 标记为 noexcept 没有帮助。

但是,我不明白为什么这会成为问题。理论上,只有在调用 lambda 时才会发生异常,不是吗?

以下代码不会导致出现警告:

auto test = [] {
    throw 0;
};

是 clang-tidy 错了,还是我遗漏了什么?

最佳答案

Clang-Tidy 警告是关于全局变量的构造,而不是关于此类的 operator()。因此,这看起来像是误报。

我会将变量设为 constexpr,因为它在程序的生命周期内无法更改。这也应该抑制警告以及 constexpr 无法完成抛出此类异常。

PS:您可以在 bugs.llvm.org 上记录 Clang-Tidy 的错误

关于c++ - 关于静态全局 lambda 变量的错误 clang-tidy 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53467901/

相关文章:

c++ - 如何在 qt4(信号/插槽)中监控 QProcess finished()

android - 在 Android NDK 中为 AccountPicker 接收 onActivityResult

clang-tidy - 在 clang-tidy 配置中没有 `-line-filter` 等价物?

c++ - 使用数组的模板专门化,std::is_array

c# - 如何使用 lambda 表达式选择多列过滤器

c# - C#-为什么我的用于错误处理的包装函数无法捕获异常?

c# - 如何对以下列表进行排序

c++ - 铿锵整齐警告 : an exception may be thrown in function

c++ - 铛整洁用static_cast替换reinterpret_cast

c++ - 使用 Ackermann 函数 C++ 进行内存