Mediumlambda

Чем mutable lambda отличается от обычной?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

По умолчанию operator() лямбды — const, поэтому captured-by-value поля нельзя менять. mutable разрешает менять захваченные по значению поля.

int x = 0;

// auto bad = [x]() { x = 5; };   // ошибка: operator() const
auto counter = [x]() mutable {
    return ++x;   // меняет свою копию x при каждом вызове
};
counter();  // 1
counter();  // 2 — состояние сохраняется
std::cout << x;  // 0 — оригинал не изменился (это копия)
  • Изменение в captured-by-value не влияет на оригинал в enclosing scope — это копия;
  • captured-by-reference всегда «изменяемо» (через ссылку), mutable не нужен;
  • Применение: счётчики, mutable state в callback’ах (генератор id при каждом вызове).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.