关于lambda捕获的使用的快速查询,特别是关于"通过值捕获"。这是我的代码:
class carl{
public:
int x;
void sayhi();
};
void carl::sayhi(){
auto c1 = [=](){ //capture by value
std::cout<<&x<<std::endl;
x = 10; // access the copy?
};
c1();
std::cout<<&x<<std::endl; // same address as the one inside lambda
std::cout<<x<<std::endl; //prints 10 now WHY????
}
int main(int argc, char** argv) {
carl x;
x.sayhi();
return 0;
}
我的问题是,&#34;按价值&#34;在lambda捕获应该影响原始?他们不应该制作副本吗?从我的例子中,我使用[=]
所以我的lambda将在该类的范围内复制变量。我尝试访问x
并直接更改了x的原始值。我尝试研究它并从我自己的话说:它已经声明访问lambda中具有[=]
捕获的变量将访问lambda的本地副本。
编辑:我实际上感觉我正在尝试访问this
指针,该指针也是从[=]
捕获的。因此,从我的代码访问x
就像访问this->x
一样,它与我原来的指针相同。如果我错了,请纠正我。
答案 0 :(得分:4)
当您访问lambda中的非静态类数据成员时,实际上是按值捕获this
指针并以this->x
的形式访问类成员。这意味着没有制作x
的本地副本。您正在修改当前对象中的实际x
。
如果事实上,如果某个值真正被捕获&#34;按值&#34;,作为副本,尝试修改它将失败。如果x = 10
真的被值捕获,x
甚至都不会编译。如果您希望能够修改捕获的状态,则需要将lambda声明为mutable
。