最近我在学习c++11中的lambda函数。但是我不知道[=]
和[&]
有没有区别。如果有区别的话,具体是什么?
并且,在这两种情况下,lambda函数体中的this
是否有区别?
区别在于如何捕获值
&
通过引用进行捕获=
通过值进行捕获快速示例
int x = 1;
auto valueLambda = [=]() { cout << x << endl; };
auto refLambda = [&]() { cout << x << endl; };
x = 13;
valueLambda();
refLambda();
这段代码将会打印
1
13
第一个 lambda 在定义 valueLambda
时通过值捕获了 x
。因此它得到了当前的值 1
。但是 refLambda
捕获了对本地变量的引用,因此它看到的是最新的值。
我在这里回复是想指出一件事:
this
指针始终以值的方式进行捕获。在 C++11 中,这意味着如果你想要捕获类中变量的一个副本,比如 this->a
,实际上它会被以引用的方式进行捕获。为什么呢?
考虑:
[this]() { ++this->a; }
this
被按值捕获,但这是一个指针,所以a通过this
引用。
如果您想要成员变量的副本,在C++11中,可以像这样做:
auto copy = this->a;
[copy]() mutable { ++copy; }
注意这个警告,因为它并不直观,除非你深思熟虑。
JaredPar已经回答了第一个问题。
对于您的第二个问题,lambda体中的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*
};
}
};
this
是否有任何不同? - pktangyuethis
的捕获,因为this
总是按值捕获的。 - JaredPar