I have a program as below:
int main()
{
int val = 4;
auto add = [val](int a)->int{
val += 2;
return a+val;
};
cout <<
Inside a lambda, captured variables are immutable by default. That doesn't depend on the captured variables or the way they were captured in any way. Rather, the function call operator of the closure type is declared const
:
This function call operator or operator template is declared
const
(9.3.1) if and only if the lambda-expression’s parameter-declaration-clause is not followed bymutable
.
Therefore, if you want to make the captured variables modifiable inside the body, just change the lambda to
auto add = [val] (int a) mutable -> int {
val += 2;
return a+val;
};
so the const
-specifier is removed.
The operator ()
of a lambda is implicitly const
unless the lambda is declared mutable
- and you can't modify the data members in a const
member function. This happens regardless of the type of the capture.
Just capture it by reference, it will work !!
auto add = [&val](int a) -> int{
//
}