C++11:可变的 lambda 似乎不会改变变量?

C++11: The mutable lambda doesn't seem to change the variable?

我在下面进行了快速测试:

#include<iostream>
using namespace std;
int main(){
    int i=2;
    auto f=[=]()mutable{++i;};
    f();
    f();
    cout<<i<<endl;
    return 0;
}

但是结果还是打印“2”。为什么我没有在可变 lambda 中被修改?我正在使用 clang --std=c++1z.

谢谢!

您使用 [=] 进行捕获,这意味着 lambda 获得 i 的副本。此副本独立于 main.

中的 i

您需要做的是通过引用捕获 [&],以便将更改应用到 main 中的 i

[=] 表示您正在按值捕获 i。即使是可变的 lambda 也可以修改它,但它只是 lambda 内部的一个副本,那么对它的任何修改都与原始变量无关。

您可能需要 capture-by-reference,然后就不再需要 mutable。例如

auto f = [&i]() {++i;};
int i=2;
auto f=[=]()mutable{++i;};
f();
f();
std::cout<<i<<std::endl;

这会打印 2。

int i=2;
auto f=[&](){++i;};
f();
f();
std::cout<<i<<std::endl;

这会打印 4。

int i=2;
auto f=[=]()mutable{++i; std::cout << i << std::endl;};
f();
f();
std::cout<<i<<std::endl;

这会打印出 3 4 2。

=将捕获的数据复制到 lambda 中。

如果mutable可以修改

& references 在 lambda 中捕获数据。

通过引用修改事物是合法的。

[=]等同于[i][&]等同于[&i]在此上下文中(可以显式列出捕获,或者让捕获隐含地列出 none 并使用 =&).