通过值捕获使用lambda表达式

时间:2015-07-02 06:02:13

标签: c++ c++11 lambda

关于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一样,它与我原来的指针相同。如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:4)

当您访问lambda中的非静态类数据成员时,实际上是按值捕获this指针并以this->x的形式访问类成员。这意味着没有制作x的本地副本。您正在修改当前对象中的实际x

如果事实上,如果某个值真正被捕获&#34;按值&#34;,作为副本,尝试修改它将失败。如果x = 10真的被值捕获,x甚至都不会编译。如果您希望能够修改捕获的状态,则需要将lambda声明为mutable