http://coliru.stacked-crooked.com/a/29520ad225ced72d
#include <iostream>
struct S
{
void f()
{
//auto f0 = [] { ++i; }; // error: 'this' was not captured for this lambda function
auto f1 = [this] { ++i; };
auto f2 = [&] { ++i; };
auto f3 = [=] { ++i; };
f1();
f2();
f3();
}
int i = 10;
};
int main()
{
S s;
std::cout << "Before " << s.i << std::endl;
s.f();
std::cout << "After " << s.i << std::endl;
}
Before 10
After 13
问题:为什么[=]
能够修改lambda中的成员变量?
答案 0 :(得分:19)
问题&GT;为什么[=]能够修改lambda中的成员变量?
因为(参见cpp reference)[=]
“捕获lambda正文中使用的所有自动变量,如果存在则通过引用捕获当前对象”
所以[=]
通过引用捕获当前对象,并且可以修改i
(它是当前对象的成员)。
答案 1 :(得分:9)
如果以相同的方式书写,这种行为将更加明确:
auto f3 = [=] { ++(this->i); };
你没有抓住i
而是this
,它会保持不变,但是其指向的东西可以像任何其他指针那样被编辑。
答案 2 :(得分:6)
您可以设想[=]
按值捕获this
,然后使用复制的this
访问this->i
。
复制的this
仍允许您访问对象this
点。