今天在复习秋招的时候,刚好碰到了一道lambda表达式的题目,所以在此学习了一下这方面的知识,参考博客:
lambda表达式
lambda表达式是c++ 11新增的一个特性。它可以方便的构造匿名函数。如果你的代码中需要大量的小函数,而且这些函数只需要调用一次,那么不妨把它们重构为lambda表达式。
lambda表达式声明方式如下:
(1)[ capture ] ( params ) opt -> ret { body }
(2)[ capture ] ( params ) -> ret { body }
(3)[ capture ] ( params ) { body }
(4)[ capture ] { body }
其中:
- (1)是完整的lambda表示式形式。
- (2)const类型的lambda表达式,该类型的表达式不能改捕获(“capture”)列表中的值。
(3)省略了返回值类型的 lambda 表达式,但是该 lambda 表达式的返回类型可以按照下列规则推演出来:
1、如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
2、如果没有 return 语句,则类似 void f(…) 函数
(4)省略了参数列表,类似于无参函数 f()。
capture介绍
capture是捕获列表;其具体解释如下:
- [a,&b] a变量以值的方式呗捕获,b以引用的方式被捕获。
- [this] 以值的方式捕获 this 指针。
- [&] 以引用的方式捕获所有的外部自动变量。
- [=] 以值的方式捕获所有的外部自动变量。
- [] 不捕获外部的任何变量。
opt介绍
opt是函数选项;可以填mutable,exception,attribute(选填)
mutable 修饰符说明 lambda 表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获对象的 non-const 方法。
exception 说明 lambda 表达式是否抛出异常(noexcept),以及抛出何种异常,类似于void f() throw(X, Y)。
attribute 用来声明属性。
实例
1 | auto fun = [] (unsigned char a) |
如上代码所示,我们声明了一个匿名的函数,并且赋值给了fun,所以程序最终输出:ff。