【发布时间】:2014-01-14 02:42:36
【问题描述】:
我最近在学习 c++11 中的 lambda 函数。但是不知道[=]和[&]有什么区别。如果有,有什么区别?
而在这两种情况下,lambda body 中的this 有什么区别吗?
【问题讨论】:
我最近在学习 c++11 中的 lambda 函数。但是不知道[=]和[&]有什么区别。如果有,有什么区别?
而在这两种情况下,lambda body 中的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有什么区别吗?
this 的捕获,因为this 总是按值捕获
我在这里回复是因为我想指出一件事:
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*
};
}
};
【讨论】: