Выбор ответа Middle Лямбды и функциональные объекты спрашивают часто обновлено

Висячий захват по ссылке

Вопрос

Функция возвращает [&total] { return total * 2; }, где total её локальная переменная. Что не так?

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

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

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

Коротко

Правильный ответ: total уничтожен после выхода, вызов лямбды читает висячую ссылку. Захват по ссылке хранит ссылку, а не значение, и не продлевает жизнь переменной.

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

  1. Ничего: лямбда продлевает жизнь захваченных по ссылке переменных
  2. Не скомпилируется: нельзя возвращать лямбду с захватом по ссылке
  3. Лямбда сама скопирует total при возврате, и ссылка станет значением
  4. total уничтожен после выхода, вызов лямбды читает висячую ссылкуправильный ответ

Разбор

Захват по ссылке хранит ссылку, а не значение, и не продлевает жизнь переменной. Возвращённая лямбда переживёт total. Нужно [total] или [t = total].

  • Продления жизни для захватов нет.
  • Компилятор не обязан это ловить (GCC и Clang иногда предупреждают).
  • Захват не меняет способ при возврате.

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

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