通过值捕获使用lambda表达式
Using lambda expressions by value capture
关于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
。
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式
- C++ Lambda 表达式:通过 ref 开销捕获
- Qt 连接无法识别 lambda 表达式