Lambda表达式(匿名函数)是一个可调用的代码单元,拥有捕获所在用户域中变量的能力,能够将函数作为对象一样使用,通常用来实现回调函数,代理等功能。Lambda表达式是函数式编程的基础,C++11引入了Lambda则弥补了C++在函数式编程方面的空缺。
基本语法
[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {
//函数体
}
如果函数体内有多个return语句时,编译器无法自定推断出返回类型,此时必须指定返回类型。
捕获列表
有时候,需要在匿名函数内使用外部变量,所以用捕获列表来传递参数。根据参数的行为,捕获列表可分为:
- 值捕获
与参数传值类似,值捕获的前提是变量可以拷贝,不同之处是,被捕获的变量在lambda表达式被创建时拷贝,而非调用时拷贝。([变量名])
-
引用捕获
与引用传参类似,引用捕获保存的是引用,原值会发生变化。([&变量名])
-
隐式捕获
在捕获列表中写一个&或=向编译器声明采用引用捕获或者值捕获
-
空捕获列表
[]为空,表示Lambda表达式不能使用所在函数中的变量。
-
表达式捕获
上述捕获只能捕获左值,而不能捕获右值。C++14之后允许捕获的成员用任意的表达式进行初始化,被声明的捕获变量类型会根据表达式进行判断,判断方式与使用auto本质上是相同的。
可变lambda
采用值捕获的方式,lambda表示式不能修改外部变量,如果想要修改,使用mutable修饰。