В вашем примере было бы невозможно изменить x
, так как лямбда не mutable
, что делает оператор вызова функции const
. Но даже если лямбда равна mutable
, верно, что цитируемый отрывок делает тип x
в лямбде const int
.
Если я правильно помню, это было преднамеренное решение в C ++ 11, чтобы использование x
в лямбда-выражении велось аналогично использованию x
во вложенной области видимости. То есть
void foo(int&);
void foo(const int&);
const int x = 0;
foo(x); // calls foo(const int&)
auto foo = [x]() mutable {
foo(x); // also calls foo(const int&)
};
Это помогает избежать ошибок, когда, например, некоторый код переписывается с явного цикла на вызов алгоритма стандартной библиотеки с лямбда-выражением.
Если я ошибаюсь в этом воспоминании, надеюсь, кто-то с правильным ответом вступит и напишет свой собственный ответ.