C++11 lambda表达式

C++11lambda表达式

1、lambda的申明方式

Lambda表达式是c++11的新特性,它允许程序员在函数内部创建一个匿名函数,对于一些小型的功能模块,可以使用lambda表达式来实现。很多其他语言已经有了lambda表达式,比如objective-c中block就类似。

Lambda表达式的声明方式:

例如:

auto fadd = [](int a, int b){

       return a + b;

};

Fadd就是一个匿名函数,后面是它的实现,auto是自动类型,也是c++11新加入的特性,auto可以自动判断类型。[]表示开始定义lambda表达式,他可以带参数,()里面的是函数的参数,{}体内的是函数体。这里函数的返回值隐含了,也可以指明函数的返回值。例如

显示指明返回值,采用:

auto fadd = [](int a, int b)->int

    {

       return a + b;

};

总结:lambda表达式的申明形势为

[captures] (params) -> ret {Statments;}

 

2、lambda表达式的变量截取

考虑这样一种情况,加入你的lambda表达式需要使用外部变量,那该怎么办呢?lambda表达式提供了变量截取的功能。

例如:

int val = 1;

    auto fadd = [&](int a, int b)->int

    {

       return val = a + b + val;

    };

    cout << fadd(2, 3) <<endl;

cout << "val = " << val<< endl;

val是外部变量,如果在fadd中需要访问val,必须在[]中指明截取方式,这里用的&表示截取外部作用域中所有变量,并作为引用在函数体中使用。

Lambda表达式中有多种变量截取方式。

下面是各种变量截取的选项:

  • [] 不截取任何变量
  • [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
  • [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
  • [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值