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表达式是一种函数对象,因此它可以赋值给一个合适的函数指针或函数引用,也可以作为模板参数传递给一个泛型函数或类。
参考
评论