语法
[capture](parameters) mutalble->return-type{statement};
capture
- [] :什么也不捕获
- [=] : 按值的方式捕获所有变量
- [&] : 按引用方式捕获所有变量
- [boo] : 值捕获boo的值
- [=,&a] : 按值捕获所有局部变量,按引用捕获变量a
- [=,&a,&b,&c] : 同上
- [&,a] : 按引用捕获所有局部变量,按值捕获方式捕获a
- [&,a,b,c] : 同上
- [this] : 在成员函数中,直接捕获this指针
mutable
值捕获后,在匿名函数中对该值是不能做修改的,如果想要做修改,必须加上 mutable 关键字,并且在匿名函数中做的修改结果在函数外是不会生效的。
parameters
参数列表也是可以将外部的值传递给匿名函数内部的;与正常函数的形参一样。
return-type
对于编译器能自动推导的返回类型,可以省略 return-type,但是如果无法推导的类型,就必须添加上返回类型
当函数不止一个return语句时,就需要加上返回类型了
示例
auto f = [](int x, int y){ return x + y; };
int result = f(10, 20); //result == 30
捕获列表
int a = 10; b = 20, c = 30;//将变量a和b以值捕获方式传入到表达式中(a、b的值不可修改)
auto f1 = [a, b]{ return a + b; };
int result1 = f1(); //result1 == 30//将所有变量以值捕获方式传入到表达式中
auto f2 = [=]{ return a + b + c; };
int result2 = f2(); //result2 == 60
int a = 10; b = 20, c = 30;//将变量a和b以引用捕获方式传入到表达式中
auto f1 = [&a, &b]{ a++; b++; };
f1();
//a == 11 b == 21//将所有变量以引用捕获方式传入到表达式中
auto f2 = [&]{ a++; b++; c++; };
f2();
//a == 12 b == 22 c == 31
mutable
int a = 10;//未用mutable修饰
auto f1 = [a](){a++; //报错
}//使用mutable修饰
auto f2 = [a]() mutable {a++; //成功;修改值只在f2中有效!!!
}
// 调用f2() 后,a的值不变 !!!