1.定义
lambda表达式 就是一个函数(匿名函数),也就是一个没有函数名的函数。为什么不需要函数名呢,因为我们直接(一次性的)用它,嵌入式用的它,不需要其他地方调用它。
lambda表达式也叫闭包,闭就是封闭的意思,封闭就是其他地方都不调用它,包就是函数。
lambda表达式 其实就是一个函数对象,他内部创建了一个重载()操作符的类。
lambda 表达式的简单语法如下:[capture] (parameters) -> return value { body },只有 [capture] 捕获列表和 { body } 函数体是必选的,其他可选。
2.lambda表达式的语法归纳如下:
[ caputrue ] ( params ) opt -> ret { body; };
① capture是捕获列表;
② params是参数表;(选填)
③ opt是函数选项;可以填mutable,exception,attribute(选填)
mutable说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法。
exception说明lambda表达式是否抛出异常以及何种异常。
attribute用来声明属性。
④ ret是返回值类型。(选填)
⑤ body是函数体。
捕获列表:lambda表达式的捕获列表精细控制了lambda表达式能够访问的外部变量,以及如何访问这些变量。
1).[ ]不捕获任何变量。
2).[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
3).[=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
4).[=,&foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
5).[bar]按值捕获bar变量,同时不捕获其他变量。
6).[this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。
例1
例2
例3 lambda最大的一个优势是在使用STL中的算法(algorithms)库时,如此一行代码就可以循环打印容器的数据。