我在下面做了一个快速测试:

#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。

谢谢!

最佳答案

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,则可以修改副本
& 引用了lambda中捕获的数据。

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

在这种情况下,[=][i]相同,并且[&][&i]相同(您可以显式列出捕获,也可以通过不列出捕获内容并使用=&隐式捕获它们)。

07-24 09:45
查看更多