我最近在c ++ 11中学习lambda函数。但我不知道[=]
和[&]
之间是否存在任何差异。如果有,那有什么区别?
在这两种情况下,lambda体中的this
有什么区别吗?
答案 0 :(得分:29)
区别在于如何捕获值
&
通过引用获取=
按值抓取快速示例
int x = 1;
auto valueLambda = [=]() { cout << x << endl; };
auto refLambda = [&]() { cout << x << endl; };
x = 13;
valueLambda();
refLambda();
此代码将打印
1
13
第一个lambda在x
定义的位置按值捕获valueLambda
。因此它获得1
的当前值。但refLambda
会捕获对本地的引用,因此它会查看最新值
答案 1 :(得分:8)
我在这里回答是因为我想指出一件事:
this
指针总是按值捕获。在C ++ 11中,这意味着,如果要在类中捕获变量的副本,例如this->a
,则在实践中将始终通过引用捕获它。为什么呢?
考虑:
[this]() { ++this->a; }
this
由值捕获,但这是一个指针,因此通过this
引用。
如果你想要一个成员变量的副本,在C ++ 11中,做这样的事情:
auto copy = this->a;
[copy]() mutable { ++copy; }
请注意这一点,因为在你想到它之前它并不直观。
答案 2 :(得分:0)
第一个问题JaredPar已经回答了。
对于你的第二个问题,lambda体中的这个与它的包含类相同。以下示例来自标准。
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*
};
}
};