C++ lambda函数中[=]和[&;]之间有什么区别吗?
最近我在学习c++11中的lambda函数。但是我不知道C++ lambda函数中[=]和[&;]之间有什么区别吗?,c++,c++11,lambda,C++,C++11,Lambda,最近我在学习c++11中的lambda函数。但是我不知道[=]和[&]之间是否有任何区别。如果有,区别是什么 在这两种情况下,lambda body中的这个有什么区别吗?区别在于如何获取值 和通过引用捕获 =按值捕获 快速示例 int x = 1; auto valueLambda = [=]() { cout << x << endl; }; auto refLambda = [&]() { cout << x << endl; };
[=]
和[&]
之间是否有任何区别。如果有,区别是什么
在这两种情况下,lambda body中的
这个有什么区别吗?区别在于如何获取值
和
通过引用捕获
=
按值捕获
快速示例
int x = 1;
auto valueLambda = [=]() { cout << x << endl; };
auto refLambda = [&]() { cout << x << endl; };
x = 13;
valueLambda();
refLambda();
第一个lambda通过定义valueLambda
的点处的值捕获x
。因此,它获得当前值1
。但是refLambda
捕获了对本地的引用,因此它可以看到最新的值JaredPar已经回答了第一个问题
对于第二个问题,lambda body中的this与其包含类的this相同。以下示例来自标准
struct S1 {
int x, y;
int operator()(int);
void f() {
[=]()->int {
return operator()(this->x + y);
// equivalent to S1::operator()(this->x + (*this).y)
// this has type S1*
};
}
};
- &指“通过引用捕获”
- =表示“按价值捕获”
我在这里回答是因为我想指出一件事:
此
指针始终由值捕获。在C++11中,这意味着,如果您想在类中捕获变量的副本,例如this->a
,那么在实践中总是通过引用来捕获它。为什么?
考虑:
[this]() { ++this->a; }
此
由值捕获,但这是一个指针,因此通过此
引用a
在C++11中,如果需要成员变量的副本,请执行以下操作:
auto copy = this->a;
[copy]() mutable { ++copy; }
请注意这个警告,因为在你想到它之前,它不是直观的。谢谢。那么我的第二个问题呢?如果lambda函数在一个类中,lambda body中的这个
有什么区别吗?@pktangyue它不影响这个
的捕获,因为这个
总是被value@JaredPar我不明白为什么valueLambda()会打印1,尽管它是按值捕获的,在调用valueLambda之前,x的值更改为13?@gaurav valueLambda()在定义valueLambda()时捕获x的值,而不是在调用它时。x=13;在valueLambda()的定义之后。此外,如果要在lambda中修改副本,则必须将其指定为可变:[copy]()可变{++copy;}
auto copy = this->a;
[copy]() mutable { ++copy; }