1.概念
1)lambda表达式是一个可调用的代码单元,它由一个捕获列表、一个参数列表、一个箭头、一个返回类型、一个函数体组成:
2)可以忽略参数列表和返回类型,但必须包含捕获列表和函数体:
3)忽略参数列表:参数列表可以忽略,捕获列表不可以忽略,也就是说“()”可以忽略,“[]”不可以忽略
4)忽略返回类型:
- 忽略返回类型同时也会忽略那个箭头
- 如果lambda表达式的函数体只是一个单一的return语句,则返回类型可从return的表达式的类型来推断
- 如果lambda表达式的函数体除了单一的return语句还有别的内容,则默认返回void
- 单一的return语句包括带有条件运算符"?"的return语句,但不包括带有 if/else 条件判断的return语句
5)底层实现原理:仿函数
2.捕获列表
1)捕获列表一般为空,可以存放局部变量,来指出lambda会使用这些局部变量
2.1值捕获
对局部变量采取拷贝的方式进行捕获,需要注意的是,是在创建lambda时拷贝,而不是使用lambda时:
2.2引用捕获
对局部变采取引用的方式进行捕获,此时必须保证被引用的对象在lambda执行时是存在的(函数返回lambda时,这个lambda就不能使用引用捕获)。为什么需要引用捕获?因为有些局部变量不能被拷贝:
2.3隐式捕获
=告诉编译器使用值捕获,&告诉编译器使用引用捕获:
也可以混合使用隐式捕获和显示捕获,此时捕获列表中第一个位置必须是隐式捕获。
3.可变lambda
1)对于值捕获:默认情况下,lambda不会改变其值,但是如果希望改变,则需要在参数列表后面加上关键字mutable:
2)对于引用捕获:如果是const变量的引用,则不能改变它;如果是非const变量的引用,则可以改变
4.指定lambda的返回类型
函数体有单一的return语句,我们无须指定返回类型,但是遇上显式的if/else条件判断有多个return语句的时候,就必须指定了:
5.标准库函数对象(非c++11)
可以使用标准库定义的一些函数对象来充当泛型算法的谓词:
标准库定义的这些函数对象对指针同样适用(正常方法去比较两个不相关的指针是错误的):
在这里,是想要通过比较指针的它自己的地址来排序这个存有指针的vector。