一段码字:
刚开始做东西的时候,看到难的东西,往往都是先复制粘贴,等事后再说。然后就没有了然后...
int mian(){
int a = 1;
int b = 2;
auto func = [=,&b](int c)->int {return b += a+c}; // ???????????
return 0;
}
语法
[捕获](参数列表) mutable ->return-type{statement}
捕获:是针对参数传入的关键字,它分值传递和引用两种方式
参数列表:和c语言一致
mutable:修饰符,默认情况Lambda是const函数,在添加mutable后,就会取消其常量属性。能对父作用域的成员变量做修改操作。如果是传值操父作用域的变量不起作用
int b = 1;
auto f3 = [=] () mutable{
b = 99;
}; // 如果省略mutable,会出现编译错误。提示不能修改b值,因为它是const
->return-type:这是lambda函数的返回类型。主义这个是一体的,如果需要省略则全部省略。省略后,c++会自动推导返回类型,默认是int。
与普通函数最大的区别是,除了可以使用参数以外,Lambda函数还可以通过捕获列表访问一些上下文中的数据。具体地,捕获列表描述了上下文中哪些数据可以被lambda使用,以及使用方式(以值传递还是引用传递)。
常用的几种方式
1.[var] 表示值传递方式捕捉变量var;
2.[=]表示值传递方式捕捉所用父作用域的变量(包括this);
3.[&var]表示引用传递捕捉变量var;
4.[&]表示引用方式捕捉所有父作用域的变量(包括this)
5.[this]表示值传递方式捕捉当前的this指针
组合使用
1.[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量;
2.[&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。
错误事例
1.[=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
2.[&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。