Выбор ответа Senior Лямбды и функциональные объекты обновлено
Неявный захват this
Вопрос
Что захватывает [=] в лямбде внутри метода класса и что изменилось в C++20?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Указатель this; в C++20 неявный захват через [=] устарел. Обращение к полю x внутри лямбды это this-x, поэтому [=] захватывает указатель this.
Варианты ответа
- Указатель
this; в C++20 неявный захват через[=]устарелправильный ответ - Копию всего объекта
*this, поэтому лямбда безопасно переживёт объект - Ничего из членов класса: поля недоступны в лямбде без явного захвата
- Каждое используемое поле класса по значению, как обычные переменные
Разбор
Обращение к полю x внутри лямбды это this->x, поэтому [=] захватывает указатель this. Если лямбда переживёт объект (колбэк, поток), обращение к полям будет через висячий указатель. C++20 объявил такой неявный захват устаревшим, чтобы это было видно: [=, this]. Копию объекта даёт [*this] (C++17).
- Копию объекта
[=]не делает, отсюда и ловушка. - Поля доступны через захваченный
this. - Поля по отдельности не копируются.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.