Functions
F.54
При написании лямбды, захватывающей `this` или любой член данных класса, не используйте захват по умолчанию `[=]`
Причина
Это запутывает. Написание [=] в функции-члене выглядит как захват по значению, но на самом деле захватывает члены данных по ссылке, потому что фактически захватывает невидимый указатель this по значению. Если вы хотели именно это, напишите this явно.
Пример
class My_class {
int x = 0;
// ...
void f()
{
int i = 0;
// ...
auto lambda = [=] { use(i, x); }; // ПЛОХО: "выглядит как" захват по значению
x = 42;
lambda(); // вызывает use(0, 42);
x = 43;
lambda(); // вызывает use(0, 43);
// ...
auto lambda2 = [i, this] { use(i, x); }; // ok, наиболее явно и наименее запутанно
// ...
}
};
Примечание
Если вы намерены захватить копию всех членов данных класса, рассмотрите C++17 [*this].
Контроль
- Помечать любой список захвата лямбды, который указывает захват по умолчанию
[=]и также захватываетthis(явно или через захват по умолчанию и использованиеthisв теле)