Анализатор обнаружил подозрительный захват переменной в лямбда функции.
Рассмотрим варианты срабатывания диагностики:
Пример 1:
function lambda; { auto obj = dummy<int>{ 42 }; lambda = [&obj]() { .... }; }
Переменную, которая будет уничтожена при выходе из блока, захватывают по ссылке. Время жизни лямбда функции при этом превышает время жизни объекта. Это приведет к использованию ссылки на уничтоженный объект при вызове лямбда функции.
Вероятно, объект нужно захватить по значению:
function lambda; { auto obj = dummy<int>{ 42 }; lambda = [obj]() { .... }; }
Пример 2:
function lambda; { auto obj1 = dummy<int>{ 42 }; auto obj2 = dummy<int>{ 42 }; lambda = [&]() { .... }; }
В этом случае диагностика определит, что обе переменные захвачены по ссылке и выдаст предупреждение на каждую из них.
Также возможно, что функция возвращает лямбду, захватившую локальную переменную по ссылке.
Пример 3:
auto obj = dummy<int>{ 42 }; return [&obj]() { .... };
В этом случае вызывающий код получит из функции лямбду, вызов которой приведет к использованию невалидной ссылки.
Данная диагностика классифицируется как:
|