Выбор ответа Senior Лямбды и функциональные объекты обновлено

Неявный захват this

Вопрос

Что захватывает [=] в лямбде внутри метода класса и что изменилось в C++20?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Указатель this; в C++20 неявный захват через [=] устарел. Обращение к полю x внутри лямбды это this-x, поэтому [=] захватывает указатель this.

Варианты ответа

  1. Указатель this; в C++20 неявный захват через [=] устарелправильный ответ
  2. Копию всего объекта *this, поэтому лямбда безопасно переживёт объект
  3. Ничего из членов класса: поля недоступны в лямбде без явного захвата
  4. Каждое используемое поле класса по значению, как обычные переменные

Разбор

Обращение к полю x внутри лямбды это this->x, поэтому [=] захватывает указатель this. Если лямбда переживёт объект (колбэк, поток), обращение к полям будет через висячий указатель. C++20 объявил такой неявный захват устаревшим, чтобы это было видно: [=, this]. Копию объекта даёт [*this] (C++17).

  • Копию объекта [=] не делает, отсюда и ловушка.
  • Поля доступны через захваченный this.
  • Поля по отдельности не копируются.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.