[C++] 闭包的capture(捕获)方式

最近刷题喜欢用闭包把函数全部写到main中,通常一个函数可以这样:

1
function<int(int)> f = [](int x) { return x; };

但是在闭包[]中可以添加=或&两个运算符,查过cpp reference后,这个叫capture(捕获),即使用闭包外的变量的方式。讨论这两个运算符:

[=](){}:这是对闭包外变量进行const引用的形式,即不允许修改闭包外的变量。

1
2
3
4
5
6
7
int x = 5;
auto p = [=](){
x = 4;
cout << x << endl;
};
p();
cout << x << endl;

这段代码编译会报错,因为=捕获不允许修改外变量。

[&](){}:这是对闭包外变量进行引用的形式,可以修改闭包外的变量,并且保留为修改后的值。

1
2
3
4
5
6
int x = 5;
auto p = [&](){
x = 4;
};
p();
cout << x << endl;

而这段代码会输出4,因为闭包捕获到外部变量后将其修改并保留。

除此之外,还可以声明特定变量使用特定的捕获方式:

1
2
3
[a,&b]。将a按值进行传递,b按引用进行传递。
[=,&a,&b]。除a和b按引用进行传递外,其他参数都按值进行传递。
[&,a,b]。除a和b按值进行传递外,其他参数都按引用进行传递。