C++ 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 声明.
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 表达式类型.