lambda函数中[=]和[&]之间有什么区别吗?

时间:2014-01-14 02:42:37

标签: c++ c++11 lambda

我最近在c ++ 11中学习lambda函数。但我不知道[=][&]之间是否存在任何差异。如果有,那有什么区别?

在这两种情况下,lambda体中的this有什么区别吗?

3 个答案:

答案 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*
    };
  }
};