c++11中的lambda表达式

时间:2020-12-09 19:14:31
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);

lambda表达式的形式:
[ 捕获列表 ] ( 形参数列表 ) 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表达式的初探就到这里,我相信设计者提出这个表达式的用意绝不止于此,继续探索下去会收获更多!