关于静态全局 lambda 变量的错误 clang-tidy 警告?
Wrong clang-tidy warning about static global lambda variables?
提供以下代码,在全局范围内,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 警告是关于全局变量的构造,而不是关于 class 之类的 operator()
。因此,这看起来像是误报。
我会将变量设置为 constexpr
,因为它在程序的生命周期内无法更改。这也应该抑制警告以及 constexpr 无法完成这样的异常被抛出。
PS:您可以在 bugs.llvm.org
记录 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 警告是关于全局变量的构造,而不是关于 class 之类的 operator()
。因此,这看起来像是误报。
我会将变量设置为 constexpr
,因为它在程序的生命周期内无法更改。这也应该抑制警告以及 constexpr 无法完成这样的异常被抛出。
PS:您可以在 bugs.llvm.org
记录 Clang-Tidy 的错误