Each lambda expression generates a unique function object (closure) that stores the captured variables as data members. For instance, the lambda expression in your code would be transformed into something like this by the compiler:
struct __uniquely_named_lambda
{
__uniquely_named_lambda(int& pos)
: pos(pos) {}
int& pos;
void operator()() const
{ ++pos; }
};
Invoking the lambda is simply a call to operator()
.
The data member is a reference since you captured by reference. If you captured by value it would be a plain int
. Also note that generated operator()
is const
by default. This is why you cannot modify captured variables unless you use the mutable
keyword.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…