先看如下代码
int id = 0;
auto f = [id]() mutable
{
cout << id << endl;
++id;
};
id = 42;
f();
f();
f();
cout << id << endl;
这段代码的输出是
0
1
2
42
看起来比较奇怪,因为f()调用的时候,id已经被赋值为了42,为什么f里面的id还是0呢?lambda的原理就是仿函数,以上代码等同于
class LamdaClass
{
public:
int m_value;
public:
LamdaClass(int local)
{
m_value = local;
}
void operator()()
{
cout << m_value << endl;
++m_value;
}
};
int id = 0;
LamdaClass lamda2(id2);
id = 42;
lamda2();
lamda2();
lamda2();
cout << id << endl;
这里一看,就比较明白了,lambda2在初始化的时候使用的是id是0,内部的m_value就是0,之后id被赋值为42已经和lambda2没有关系了,所以内部m_value虽然被改变,但丝毫影响不到外部的id。
从仿函数的角度去理解lambda,很多问题瞬间就清晰了。如果lambda的捕捉参数时不是值传递,而是引用传递,那么m_value就和外部的id绑定了。