Неправильное лягушатное предупреждение о статических глобальных лямбда-переменных? - PullRequest
0 голосов
/ 25 ноября 2018

При условии, что следующий код в глобальной области видимости 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)
                  ^

Маркировка лямбды как noexcept не помогает.

Однако я не понимаю, почему это может быть проблемой.Исключение может возникнуть только теоретически, когда вызывает лямбду, не так ли?

Следующий код не приводит к появлению предупреждения:

auto test = [] {
    throw 0;
};

Is clang- неправильно или я что-то упустил?

1 Ответ

0 голосов
/ 25 ноября 2018

Предупреждение Clang-Tidy относится к созданию глобальной переменной, а не к operator() такого класса.Следовательно, это выглядит как ложное срабатывание.

Я бы сделал переменную constexpr, так как она не может измениться за время жизни вашей программы.Это должно также подавить предупреждение, так как constexpr не может быть сделано из-за такого исключения.

PS: Вы можете регистрировать ошибки для Clang-Tidy на bugs.llvm.org

...