C++ Lambda函数正在提供意外的输出

C++ Lambda函数正在提供意外的输出,c++,C++,我在查看上的lambda函数时发现了以下代码 int i = 0; auto x = [i]() mutable { cout << ++i << endl; }; x(); cout << i << endl; auto y = x; x(); y(); 无法理解为什么最后两条语句被打印为2和2。即使“i”是可变的,它也不会影响lamda函数之外的i值。因此,x()和y()应该打印1和1。任何人都可以解释为什么打印2和2。x有一份i。我称之为x

我在查看上的lambda函数时发现了以下代码

int i = 0;
auto x = [i]() mutable { cout << ++i << endl; };
x();
cout << i << endl;
auto y = x;
x();
y();

无法理解为什么最后两条语句被打印为2和2。即使“i”是可变的,它也不会影响lamda函数之外的i值。因此,x()和y()应该打印1和1。任何人都可以解释为什么打印2和2。

x
有一份
i
。我称之为
x.I

x(); -- prints ++x.i, aka 1
cout << i; -- prints i, aka 0
auto y = x; -- copies x into y.  x.i is 1, y.i is also 1.
x(); -- prints ++x.i, aka 2
y(); -- prints ++y.i, aka 2
x();--打印++x.i,又名1

couti
的值保存为lambda函数生成的函子的一个字段,因此当您复制它时,该字段也会与值
1
一起复制。然后调用函子增加每个对象的
i
字段并显示该值,因此得到
2
2

x(); -- prints ++x.i, aka 1
cout << i; -- prints i, aka 0
auto y = x; -- copies x into y.  x.i is 1, y.i is also 1.
x(); -- prints ++x.i, aka 2
y(); -- prints ++y.i, aka 2