通过值捕获使用lambda表达式

Using lambda expressions by value capture

本文关键字:lambda 表达式      更新时间:2023-10-16

关于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;
}

我的问题是,lambda中的"按值"捕获是否会影响原始捕获?难道他们不应该复印一份吗?在我的例子中,我使用了[=],所以我的lambda将在该类的范围内复制变量。我尝试访问x,它直接改变了x的原始值。我试着对此进行研究,并用我自己的话来说:有人说,访问具有[=]捕获的lambda内部的变量将访问lambda的本地副本。

编辑:我实际上有一种感觉,我正在尝试访问this指针,它也是从[=]捕获的。因此,从我的代码中访问x就像访问this->x一样,它与我原来的指针相同。如果我错了,请纠正我。

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

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