C++ 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; };

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


在这两种情况下,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; }