In C++, Value Capture in a lambda expression can Capture variables either by Value or by Reference. For value passing, lambda expressions copy the value of the variable into the closure of the lambda expression and store the value in the closure for use in the lambda expression. The captured value in this way defaults to const.
This is because, when we capture a variable, the lambda expression may be called multiple times, with each call creating a new closure. If the captured value is not const, then modifying the value in the closure will result in uncertain results on subsequent calls to the lambda expression. If the captured value is const, it ensures that the value in the closure will not be modified, ensuring the reentrant of the closure.
Of course, if we want to modify captured values in a lambda expression, we can also do so by using the mutable keyword. In this case, the variable in the closure generated by the lambda expression is still const, but we can use the mutable keyword to signal that the lambda expression can change the value of the captured variable.