Lambda表达式
Lambda表达式是一个可以调用的代码单元,可以将其理解为一个未命名的匿名函数。与普通函数类似,一个Lambda有一个返回类型,参数列表和一个函数体,但是不同的是,Lambda可以定义在函数内部。
Lambda表达式如下:
[capture list](parameter list)->return type{function body}
[capture list] :表示Lambda所在函数的局部变量的列表,一般为空。
其余和一般函数无差别。
-
Lambda可以忽略参数列表和返回类型,但是必须包含捕获列表和函数体。
auto f = []{return 42;}
代码意义:定义一个可调用对象f,它不接受参数,返回42。
-
Lambda不能有默认参数,也就是说调用时实参数目一定等于形参。
[](const string& a,const string& b){return a.size() < b.size();}
代码意义:空捕获列表表示不使用它所在的函数的任何局部变量,该Lambda作用是比较a和b长度,返回比较结果(返回类型系统会自行推断)。
-
Lambda值捕获
int func1(){ int a = 42;//局部变量 //将局部变量拷贝到名为f的可调用对象 auto f = [a]{return a;}; a = 0; auto j = f();//j=42;f保存了我们创建它时的拷贝 }
代码意义:这个mylamda表示这个匿名函数捕获变量a,作用是返回a。值捕获效果类似值传递,采用拷贝机制,对捕获变量的修改不影响原来的变量。
-
Lambda引用捕获
int func2(){ int a = 42;//局部变量 //对象f2包含a的引用 auto f2 = [&a]{return a;}; a = 0; auto j = f();//j=0;f2保存了a的引用而不是拷贝 }
代码意义:这个mylamda表示这个匿名函数捕获变量a,作用是返回a。引用捕获效果类似引用传递,采用引用机制,对捕获变量的修改影响原来的变量(实际是同一个)。
-
Lambda隐式捕获
auto f1 = [=]{};//对所有局部变量采用值捕获 auto f2 = [&]{};//对所有捕获变量采用引用捕获 auto f3 = [=, &a1, &a2];//对a1,a2采用引用捕获,其余采取值捕获 auto f4 = [&, a1, a2];//对a1,a2采用值捕获,其余采取引用捕获
-
可变Lambda:一般而言Lambda不会改变捕获变量的值,如果要改变必须加上关键字mutable。变量可不可改变依赖于一样依赖于其是不是const。
int func(){ int a = 42;//局部变量 //对象f2可以改变它捕获的变量的值 auto f2 = [a] mutable {return a;}; a = 0; auto j = f();//j=43。 }
-
指定Lambda的返回类型:一般来说Lambda都能自己都能推断返回类型,但是当返回是在if语句,系统不能自动推断,必须以后置方式给出返回类型。
int f2 = [a] mutable -> int {if(a>0)return a;else return -a;};