V788. Consider reviewing a captured variable in lambda expression.
Анализатор обнаружил подозрительный захват переменной в лямбда функции.
Рассмотрим несколько вариантов срабатывания диагностики.
Пример 1:
int x = 0;
auto f = [x] { };
....
x = 42;
f();
...
Переменную, значение которой может быть точно вычислено в compile-time, захватывают в лямбда функции по значению. Внутри этой функции значение переменной будет таким, которым оно было в момент захвата, а не то, которая имеет эта переменная в момент вызова лямбда функции. Возможно, необходимо захватить переменную по ссылке.
int x = 0;
auto f = [&x] { };
....
x = 42;
f();
...
Также возможно, что в ходе рефакторинга был удалён код, который присваивал переменной какое-либо значение.
int x = 0;
if (condition) x = 42;
else x = 43;
auto f = [x] { };
Если же необходимо захватить некую константу, то лучше явно указать в типе переменной 'const' или 'constexpr'.
constexpr int x = 0;
auto f = [x] { };
Пример 2:
int x;
auto f = [x] { };
Неинициализированная переменная захватывается по значению. Её использование приведёт к Undefined Behavior. Если предполагалось, что вызов функции должен проинициализировать переменную, то её необходимо захватить по ссылке.
int x;
auto f = [&x] { x = 42; };
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки использования неинициализированных переменных. |
Данная диагностика классифицируется как:
|