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

时间:2018-11-25 13:21:34

标签: 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;
};

整洁的写错了吗,还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

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

我将使变量constexpr成为变量,因为它在程序的生存期内不会更改。这样不仅可以抑制警告,还可以阻止constexpr引发此类异常。

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