C++11之后已经支持lambda表示式,简单了解下这颗语法糖吧.
lambda表达式是什么
Lambda是一个匿名函数.我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样传递).可以写出更简洁、更灵活的代码.
为什么要使用lambda表达式
我们想要将一些步骤抽象成一个函数,使用lambda就不需要废心的想一个函
数名.可以在表达式当中直接定义一个函数,而不需要将定义函数和表达式分开,这样有助于将逻辑用更紧凑的方式表达出来.
引入了闭包.即将当前作用域中的变量通过值或者引用的方式封装到lambda表达式当中,成为表达式的一部分.
使代码简洁,变得更优美.
说再多也体会不到这颗语法糖到底是甜还是不甜,不如直接实践起来.
lambda表达式语法
1 | [capture](parameters) mutable ->return-type{statement} |
[capture]:捕捉列表.捕捉列表总是出现在Lambda函数的开始处.实际上,[]是Lambda引出符.编译器根据该引出符判断接下来的代码是否是Lambda函数.捕捉列表能够捕捉上下文中的变量以供Lambda函数使用.
(parameters):参数列表.与普通函数的参数列表一致.如果不需要参数传递,则可以连同括号”()”一起省略.
mutable:mutable修饰符.默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空).
->return-type:返回类型.用追踪返回类型形式声明函数的返回类型。我们可以在不需要返回值的时候也可以连同符号”->”一起省略.此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导.
{statement}:函数体.内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量.
捕捉列表说明
[var] 表示以值传递方式捕捉变量var
[=] 表示值传递捕捉所有父作用域变量
[&var] 表示以引用传递方式捕捉变量var
[&] 表示引用传递捕捉所有父作用域变量
[this] 表示值传递方式捕捉当前的this指针
捕获列表可以由一个或多个捕捉项构成.lambda似乎和函数差别不大.我们甚至可以通过函数指针的方式调用lambda表达式.
1 |
|
更多更详尽的用法还请参照官方手册 https://en.cppreference.com/w/cpp/language/lambda