Выбор ответа Middle Лямбды и функциональные объекты спрашивают часто обновлено
Висячий захват по ссылке
Вопрос
Функция возвращает [&total] { return total * 2; }, где total её локальная переменная. Что не так?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: total уничтожен после выхода, вызов лямбды читает висячую ссылку. Захват по ссылке хранит ссылку, а не значение, и не продлевает жизнь переменной.
Варианты ответа
- Ничего: лямбда продлевает жизнь захваченных по ссылке переменных
- Не скомпилируется: нельзя возвращать лямбду с захватом по ссылке
- Лямбда сама скопирует
totalпри возврате, и ссылка станет значением totalуничтожен после выхода, вызов лямбды читает висячую ссылкуправильный ответ
Разбор
Захват по ссылке хранит ссылку, а не значение, и не продлевает жизнь переменной. Возвращённая лямбда переживёт total. Нужно [total] или [t = total].
- Продления жизни для захватов нет.
- Компилятор не обязан это ловить (GCC и Clang иногда предупреждают).
- Захват не меняет способ при возврате.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.