CPP-lambda表达式
Lambda表达式
用处
在面向对象中用表达式声明和定义一个函数,使其可以捕获上层函数的变量,实现闭包。或是定义只能在某个函数中使用的匿名函数
语法
1  | [capture list] (parameter list) [mutable/exception/attribute] -> return type { function body }  | 
- capture list:捕获列表
- 值捕获,定义时直接传值
 - 引用捕获,内部使用的是对应变量的引用
 - 隐式捕获,捕获所有外部变量,=表示值捕获,&表示引用捕获
 - 初始化捕获,捕获列表中可以定义变量,且可以自动auto
 
 - parameter list:传入参数列表,同普通的函数
 - [mutable/exception/attribute]:不加mutable会自动给按值捕获的变量加const
 - type:返回类型,省略后自动推导
 - function body:函数体
 
举例
自定义排序算法
1  | sort(arr,[](int a,int b){return a>b;});  | 
auto泛型
1  | int main(void){  | 
捕获类中的成员
1  | class A{  | 
深入浅出 C++ Lambda表达式:语法、特点和应用_c++ lamda 参数-CSDN博客
Lambda表达式虽然是一种语法糖,但它本质上也是一种函数对象,也就是重载了 operator() 的类的对象。每一个 Lambda表达式都对应一个唯一的匿名类,这个类的名称由编译器自动生成,因此我们无法直接获取或使用。Lambda表达式的捕获列表实际上是匿名类的数据成员,Lambda表达式的参数列表和返回值类型实际上是匿名类的 operator() 的参数列表和返回值类型,Lambda表达式的函数体实际上是匿名类的 operator() 的函数体。例如,下面的 Lambda表达式:
1  | int x = 10;  | 
相当于定义了一个匿名类,类似于:
1  | int x = 10;  | 
由于 Lambda表达式是一种函数对象,因此它可以赋值给一个合适的函数指针或函数引用,也可以作为模板参数传递给一个泛型函数或类。
参考
 评论



