lambda表达式就是用来创建匿名函数的,如果一个函数只需要用一次,不必专门起一个名字,就可以使用它。
lambda表达式的形式:
lambda表达式的初探就到这里,我相信设计者提出这个表达式的用意绝不止于此,继续探索下去会收获更多!
c++11可能是从其它语言(c#或java)中引入的这种表达式,为了编程更加方便。比如c++标准库中的sort函数通常需要提供一个函数作为参数,
使用lambda表达式看起来就简洁明了。
最近在学cocos2d-x,其中源码中的触摸事件就是用的这种表达式,所以就学习一下,有不对之处还请指正。
touchListener->onTouchBegan = [&]( Touch* touch, Event* event){
spp->showDebug( true);
debugForNormalSprite->setVisible( true);
return true;
};
lambda表达式是闭包类型的,
闭包是可以包含自由(未绑定到特定对象)变量的代码块。
我们可以认为lambda表达式就是一个集成了函数所有语句的函数名,即我们可以这样调用它:
//输出a+b的值
int a = 3;
[=](int b)mutable->void{std::cout<< a+ b << std::endl;}(3);
也可以通过赋值:
int a = 3;
auto f = [=](int b)mutable->void{std::cout<< a+ b << std::endl;};
f(3);
[ 捕获列表 ] ( 形参数列表 ) mutable(可选)或exception声明 -> 返回值类型 { 函数体 } | (1) |
[ capture-list ] ( params ) -> ret { body } | (2) |
[ capture-list ] ( params ) { body } | (3) |
[ capture-list ] { body } |
下面介绍一下这几种形式的意义:
[]内规定了函数的变量使用方式,即函数可以以值形式或引用形式使用所有内部变量(包括this指针);
后面的()是参数列表,可以为空,也可以省略不写;
mutable关键字如果有则表明可以在函数内改变外部变量(以值传递),没有就不可以改变,相当于“反const符"
异常声明就是指定函数抛出的异常,可以省略
->后面是函数的返回值类型,能够由返回值推断返回类型的函数可以不写。
{}里是函数内容。
捕获类型:
-
[]
// 不捕获任何外部变量 -
[=]
// 以值的形式捕获所有外部变量 -
[&]
// 以引用形式捕获所有外部变量 -
[x, &y]
// x 以传值形式捕获,y 以引用形式捕获 -
[=, &z]
// z 以引用形式捕获,其余变量以传值形式捕获 -
[&, x]
// x 以值的形式捕获,其余变量以引用形式捕获 - [this] //表示只以值传递方式捕捉当前的this指针。
下面是一个具体的例子,该例子输出
In lambda:123
<pre name="code" class="cpp">#include <iostream> int main() { int a = 123; auto lambda = [=]()->void{ std::cout << "In lambda: " << a << std::endl; }; lambda(); return 0; } mutable的例子: float f0 = 1.0; std::cout << [=](float f) mutable { return f0 += std::abs(f); } (-3.5); std::cout << '\n' << f0 << '\n'; //这里输出4.5和1.0,如果没有mutable,修改f0会报错
lambda表达式的初探就到这里,我相信设计者提出这个表达式的用意绝不止于此,继续探索下去会收获更多!