有些时候,我们只需要在一两个地方使用到一些简单的操作,而又不想去定义这个函数名,那么此时便可以Lambda表达式来实现我们的功能。
一个完整的lambda表达式的表达形式如下:
[capture list](parameter list)->return type (function body)
[捕获列表] (参数列表) ->返回类型 (函数体)
Lambda表达式的参数列表和返回类型是和可以忽略的,但是捕获列表和函数体一定要包含。
对于Lambda表达式,我们可以将它理解为一个未命名的内联函数。
在Lambda表达式的函数体内,是不能够访问到外部的变量的,如果想要使用函数体外定义的变量,就需要将它们进行捕获。
[]:空捕获列表,即lambda表达式不能够使用所在函数中的变量
[]:值捕获,即lambda表达式可以以拷贝的方式访问到函数中变量的值(实际上是[=],前面是格式问题),使用拷贝方式不会改变外部变量
[]:引用捕获,即lambda表达式中所使用的其所在函数中的变量均是引用方式(实际上是[&]),使用引用方式会改变变量的值,引用捕获可以使用lambda所在函数体的变量,也可以使用类的成员
当我们不希望在捕获的时候将所有的变量都捕获的时候,我们可以使用如下的方式进行捕获,例如:
[=sprite1,&sprite2]
这里我们仅仅捕获了两个变量,第一个变量是以值拷贝的方式捕获,第二个是以引用方式捕获,变量与变量之间用逗号分隔。
正常情况下,如果一个变量是值拷贝,Lambda不能改变它的值,如果我们希望改变一个值拷贝的变量的值,就需要在参数列表前加上关键字mutable
例如:
auto s1=10;
auto s2==s1{return ++s1};//错误,因为s1是值拷贝,不能改变s1的值
auto s2==s1 mutable {return ++s1};//正确
2.(参数列表)
Lambda表达式传递参数时需要注意的是,Lambda表达式不能有默认参数,也就是说Lambda表达式的实参数与形参数必须相等。