Почему лямбда C ++ 11 по умолчанию требует «изменяемого» ключевого слова для захвата по значению?

Краткий пример:

#include <iostream>

int main()
{
    int n;
    [&](){n = 10;}();             // OK
    [=]() mutable {n = 20;}();    // OK
    // [=](){n = 10;}();          // Error: a by-value capture cannot be modified in a non-mutable lambda
    std::cout << n << "\n";       // "10"
}

Вопрос: Зачем нам нужно ключевое слово mutable ? Это сильно отличается от традиционной передачи параметров именованным функциям. В чем обоснование?

У меня сложилось впечатление, что весь смысл захвата по значению состоит в том, чтобы позволить пользователю изменять временное значение - в противном случае мне почти всегда лучше использовать захват по ссылке, разве нет 't I?

Какие-нибудь просветления?

(Я, кстати, использую MSVC2010. AFAIK, это должно быть стандартным)

248
задан milleniumbug 22 April 2018 в 10:44
поделиться