
Lambda表达式在大部分语言中都有使用,可以将其简单的理解为匿名的内联函数,C++对lambda表达式的使用特别灵活,首先是lambda表达式在C++中的语法:
[capture] (params) opt -> return type {function body}
- capture list,捕获外部变量列表;
- paramters list,形参列表;
- opt,函数选项,包括 mutable和exception;、
- return type,返回类型;
- function body,函数体。
除了标准语法之外,其他的缺省形式:
| 缺省项 | 意义 | 形式 |
|---|---|---|
| opt | 省略了mutable关键字和exception,声明的是一个const类型的表达式,这种表达式不能修改捕获列表中的值 | [capture] (params) -> return type {function body} |
| 返回值类型 | 省略了return type,编译器可以根据function body中的return语句推断出Lambda表达式的返回类型,如果没有return语句,默认为void类型 | [capture] (params) opt {function body} |
| opt 和返回值类型 | 省略了opt和返回类型return type | [capture] (params) {function body} |
| 参数列表、opt 和返回值类型 | 无参的表达式 | [capture] {function body} |
注意
- lambda表达式不能有默认参数
- 不支持可变参数(可变参数,即参数的个数、类型不确定)
| 形式 | 意义 |
|---|---|
| [] | 不捕获任何变量 |
| [&] | 按引用捕获外部作用域中所有变量,并作为引用在function body中使用 |
| [=] | 按值捕获方式捕获外部作用域中所有变量,并作为副本在function body中使用 |
| [x] | 按值只捕获x变量 |
| [=,&x] | 按值捕获方式捕获外部作用域中所有变量,按引用捕获变量x,若x表示变量列表,x中的变量不能包含this且x中的变量前面必须加& |
| [&,x] | 按引用捕获方式捕获外部作用域中所有变量,按值捕获变量x,若x表示变量列表,则x中的变量前面不能加& |
| this | 捕获当前类中的this指针,让表达式拥有和当前类对成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lambda中使用当前类的成员变量和成员函数 |
注意
- 被捕获的参数,才能被lambda表达式使用
- lambda表达式可以直接使用静态局部变量
- 以传值方式捕获外部变量,则函数体中不能修改该外部变量
- 如果希望被值捕获的值被改变,就必须添加上函数选项 mutable
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)