Выбор ответа Middle Лямбды и функциональные объекты обновлено
Зачем mutable
Вопрос
Почему [n]() { return ++n; } не компилируется, а [n]() mutable { return ++n; } компилируется?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: operator() по умолчанию const, mutable снимает это. Сгенерированный operator() помечен const, поэтому поля (копии захватов) только для чтения. mutable убирает const, изменения остаются внутри объекта-замыкания и не трогают исходную переменную. - Захват остаётся по значению: внешняя n не…
Варианты ответа
mutableпревращает захват по значению в захват по ссылкеoperator()по умолчаниюconst,mutableснимает этоправильный ответ- Без
mutableлямбду с захватом нельзя вызывать дважды mutableнужен для любых лямбд с захватом по значению
Разбор
Сгенерированный operator() помечен const, поэтому поля (копии захватов) только для чтения. mutable убирает const, изменения остаются внутри объекта-замыкания и не трогают исходную переменную.
- Захват остаётся по значению: внешняя
nне меняется. - Вызывать можно сколько угодно.
- Читать захваченные значения можно и без
mutable.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.