定义一个lambda函数:
auto f = [capture](params)opt->ret{body;} ;
f(); //调用函数
其中:
- capture表示捕获函数作用域外的外部变量
- params是参数(非必须)
- opt是函数选项,例如可选择是否允许更改capture到的外部变量
- ret表示函数返回类型,一般可以免了,因为我们在f前面用了auto
- body是函数体
例子:
int main()
{
int a1 = 1, a2 = 3, a3 = 4;
auto f1 = [a1](int b){return a1+b;}; //按值捕获外部变量a1, 函数参数是b,返回a+b
cout << f1(4) << endl; //输出:5
auto f2 = [=](int b){return a1+a2+a3+b;}; //按值捕获所有外部变量, 函数参数是b,返回所有外部变量和b的和
cout << f2(4) << endl; //输出:10
auto f3 = [&](int b){return a1+a2+a3+b;}; //按引用捕获所有外部变量, 函数参数是b,返回所有外部变量和b的和
a1 = 2;
cout << f3(4) << endl; //输出:11
auto f4 = [&,a3](int b){return a1+a2+a3+b;}; //按值引用a3并按引用捕获其它外部变量, 返回所有外部变量和b的和
a3 = 2;
cout << f4(4) << endl; //输出:10
auto f5 = [&]{return a1++;}; //错误:所有外部变量复制都是const的,不能修改;
auto f5 = [&]()mutable{return a1++;}; //OK:加了mutable选项后外部变量可以修改;
}
class A
{
private:
int val;
public:
auto f = []{return val;}; //错误:没有捕获任何变量
auto f = [this]{return val;}; //OK: 捕获当前类的this指针,故能访问val
}