lambda表达式定义了一个匿名函数,可以捕获一定范围内的变量。其本质是仿函数。
优点:
1.声明式编程,好的可读性和可维护性;
2.简洁,避免代码膨胀,功能分散,提高生产率;
3.就地功能闭包,灵活。
[capture](params)opt->ret{body;};
//[捕获列表](参数表)函数选项->返回值{函数体};
捕获列表:
[]不捕获任何变量
[&]捕获外部作用域的所有变量,引用方式捕获
[=],值捕获,(类类型调用拷贝构造)有一个值副本,不可改
[=,&foo],foo引用捕获,其他值捕获
[&bar]按值捕获bar变量,其他不捕获
[this]捕获当前类种的this指针
捕获使用于当前域的变量,如:
void fun(int x)
{
auto fa = [=]()->void{};//捕获针对于fun函数内的变量
fa();
}
全局变量没有捕获的概念(都可以用)
捕获的值和传入的值可以在匿名函数中使用,如下:
void funa(int x, int y)
{
int z = x + y;
auto fa = [](int a)->void {cout << a << endl; };
fa(10);
auto fb = [x, z]()->void {int a = z + x; cout << a << endl; };//值捕获不能改,const
fb();
}
int main()
{
funa(10, 20);
return 0;
}
几种写法:
//让指针指向这个匿名函数
auto f = [](a,b)->int{return a+b};
//直接赋值
[](a,b)->int{return a+b}(10,20);
//简写,return自己推导返回类型
auto f = [](a,b){return a+b}