场景

  • lambda 表达式在很多语言里都有一席之地,因为它的原因,可以在函数里快速定义一个便携的函数,或者在函数参数里直接快速构造和传递.
  • 它可以说是匿名函数对象,一般只适用于某个函数内,只做临时使用.
  • 一般是需要在对某个数据临时特殊处理时使用,比如对某种参数类型进行限定的再次封装和行为约束.

lambda 语法

Lambda图解

Capture Clause(捕抓条款)组合:

规则1

[] : 空捕抓条款,表明 lambda body 不访问闭合范围(enclosing scope)的任何变量.

[&] : 以引用的方式访问闭合范围内的前面已声明变量.

[=] : 以值的方式访问闭合范围内的前面已声明的变量.

[this] : 访问类实例的this指针.

规则2

&,=,this 默认类型不能同时声明

相同类型的捕抓不能和默认类型同时声明,比如[&,&i] // 编译错误

不相同类型的非默认类型可以同时声明.比如[&i,j]

对同一个变量不能捕抓多次或者同时以不同捕抓方式声明. [&i,&i] [&i,i]

Parameter List(参数列表)

和捕抓列表不一样,lambda可以输入参数,一般情况下参数是为了和 C++ 函数转换才需要.

也可以使用 lambda 表达式作为参数.

在C++14里, 如果使用的是泛型参数,那么你可以使用 auto 声明.

1
2
3
4
auto y = [] (auto first, auto second)
{
    return first + second;
};

Mutable Specification(Mutable关键字)

可以使用mutable来修改捕抓条款里声明的传值变量, 注意只是相当于声明了一个本地的mutable变量作为临时变量而已,并不会修改enclosing scope 变量范围的值. 看 例子1

Exception Specification(异常规范)

可以使用throw()来声明这个lambda 不抛出C++异常. 但是在C++11里这种使用方式已经被废弃.

Return Type(返回类型)

vs2010 必须声明返回类型.

gcc 可以不声明返回类型,但是body 里必须有能推导的 return 表达式类型.