C++ 11:可变lambda似乎没有改变变量?

Tro*_*yvs 3 c++ lambda mutable c++11

我在下面有一个快速测试:

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

但结果仍然打印"2".为什么我没有在可变lambda中修改?我正在使用clang --std = c ++ 1z.

谢谢!

Nat*_*ica 10

[=]用于捕获,这意味着lambda获得了一个副本i.此副本独立于imain.

您需要做的是通过引用捕获[&]以将更改应用于iin main.

  • 如果lambda打印出它自己的`i`副本,可能有助于说明差异.然后你会看到它的值与`main`中的`int i`不同. (2认同)

Yak*_*ont 7

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

这打印2.

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

这打印4.

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

这打印3 4 2.

= 捕获的数据复制到lambda中.

如果mutable副本可以被修改.

& 引用 lambda中捕获的数据.

通过引用修改内容是合法的.

[=]与此上下文中的相同[i],并且与[&]此相同[&i](您可以明确地列出捕获,或者通过列出none和使用=或隐式捕获它们&).