С cppreference
Если в лямбда-выражении не было использовано ключевое слово mutable
, оператор вызова функции является квалифицированным const, а объекты, которые были захваченыкопия не может быть изменена изнутри этого operator()
В вашем случае нет ничего, что может быть изменено при захвате копии.
Я полагаю, что если вы что-то напишитекак
int x = 10;
auto lambda = [=] () mutable { x += 3; return x; };
const
должно исчезнуть
- РЕДАКТИРОВАТЬ -
Точность OP
Я уже знал, что добавление mutable решит проблему.Вопрос в том, что я хочу понять причину, по которой лямбда по умолчанию остается неизменной.
Я не адвокат по языку, но это кажется мне очевидным: если вы сделаете operator()
не const
, вы не можете сделать что-то как
template <typename F>
void foo (F const & f)
{ f(); }
// ...
foo([]{ std::cout << "lambda!" << std::endl; });
Я имею в виду ... если operator()
не const
, вы не можете использовать лямбды, передавая их как const
ссылку.
А когда это строго не нужно, должно быть недопустимое ограничение.