c++ 11 lambda表达式解析

今天在复习秋招的时候,刚好碰到了一道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
2
3
4
5
6
auto fun = [] (unsigned char a)
{
cout << std::hex << (int)a << endl;
};

fun(-1);

如上代码所示,我们声明了一个匿名的函数,并且赋值给了fun,所以程序最终输出:ff。