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

Зачем mutable

Вопрос

Почему [n]() { return ++n; } не компилируется, а [n]() mutable { return ++n; } компилируется?

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

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

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

Коротко

Правильный ответ: operator() по умолчанию const, mutable снимает это. Сгенерированный operator() помечен const, поэтому поля (копии захватов) только для чтения. mutable убирает const, изменения остаются внутри объекта-замыкания и не трогают исходную переменную. - Захват остаётся по значению: внешняя n не…

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

  1. mutable превращает захват по значению в захват по ссылке
  2. operator() по умолчанию const, mutable снимает этоправильный ответ
  3. Без mutable лямбду с захватом нельзя вызывать дважды
  4. mutable нужен для любых лямбд с захватом по значению

Разбор

Сгенерированный operator() помечен const, поэтому поля (копии захватов) только для чтения. mutable убирает const, изменения остаются внутри объекта-замыкания и не трогают исходную переменную.

  • Захват остаётся по значению: внешняя n не меняется.
  • Вызывать можно сколько угодно.
  • Читать захваченные значения можно и без mutable.

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

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