Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V788. Review captured variable in lambda expression.

23 Май 2017

Анализатор обнаружил подозрительный захват переменной в лямбда функции.

Рассмотрим несколько вариантов срабатывания диагностики.

Пример 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 как критические и относятся к типу: Ошибки использования неинициализированных переменных.

Данная диагностика классифицируется как: