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.此副本独立于i中main.
您需要做的是通过引用捕获[&]以将更改应用于iin main.
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和使用=或隐式捕获它们&).