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

pkt*_*yue 17 c++ lambda c++11

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

而在这两种情况下,thislambda体内有什么区别吗?

Jar*_*Par 33

不同之处在于如何捕获值

  • & 通过引用捕获
  • = 按价值捕获

快速举例

int x = 1;
auto valueLambda = [=]() { cout << x << endl; };
auto refLambda = [&]() { cout << x << endl; };
x = 13;
valueLambda();
refLambda();
Run Code Online (Sandbox Code Playgroud)

此代码将打印出来

1
13
Run Code Online (Sandbox Code Playgroud)

第一个lambda xvalueLambda定义的点处按值捕获.因此它获得了当前的价值1.但是它refLambda捕获了对本地的引用,因此它可以看到最新的值


Ger*_*ago 8

  • &表示"通过引用捕获".
  • =表示"按价值捕获".

我在这里回答是因为我想指出一件事:

this指针始终按值捕获.在C++ 11中,这意味着,如果要在类中捕获变量的副本,例如this->a,它将始终在实践中通过引用捕获.为什么?

考虑:

[this]() { ++this->a; }
Run Code Online (Sandbox Code Playgroud)

this是按值捕获的,但这是一个指针,因此引用了一个this.

如果你想要一个成员变量的副本,在C++ 11中,做这样的事情:

auto copy = this->a;
[copy]() mutable { ++copy; }
Run Code Online (Sandbox Code Playgroud)

要小心这个警告,因为在你想到它之前它并不直观.

  • 此外,如果您要修改 lambda 中的副本,您必须将其指定为可变的: [copy]() mutable { ++copy; } (2认同)