Lambda表达式

Lambda表达式

Lambda表达式是一个可以调用的代码单元,可以将其理解为一个未命名的匿名函数。与普通函数类似,一个Lambda有一个返回类型,参数列表和一个函数体,但是不同的是,Lambda可以定义在函数内部

Lambda表达式如下:

[capture list](parameter list)->return type{function body}

[capture list] :表示Lambda所在函数的局部变量的列表,一般为空。

其余和一般函数无差别。

  1. Lambda可以忽略参数列表和返回类型,但是必须包含捕获列表和函数体。

    auto f = []{return 42;}
    

    代码意义:定义一个可调用对象f,它不接受参数,返回42。

  2. Lambda不能有默认参数,也就是说调用时实参数目一定等于形参。

    [](const string& a,const string& b){return a.size() < b.size();}
    

    代码意义:空捕获列表表示不使用它所在的函数的任何局部变量,该Lambda作用是比较a和b长度,返回比较结果(返回类型系统会自行推断)。

  3. Lambda值捕获

    int func1(){
        int a = 42;//局部变量
        //将局部变量拷贝到名为f的可调用对象
        auto f = [a]{return a;};
        a = 0;
        auto j = f();//j=42;f保存了我们创建它时的拷贝
    }
    

    代码意义:这个mylamda表示这个匿名函数捕获变量a,作用是返回a。值捕获效果类似值传递,采用拷贝机制,对捕获变量的修改不影响原来的变量。

  4. Lambda引用捕获

    int func2(){
        int a = 42;//局部变量
        //对象f2包含a的引用
        auto f2 = [&a]{return a;};
        a = 0;
        auto j = f();//j=0;f2保存了a的引用而不是拷贝
    }
    

    代码意义:这个mylamda表示这个匿名函数捕获变量a,作用是返回a。引用捕获效果类似引用传递,采用引用机制,对捕获变量的修改影响原来的变量(实际是同一个)。

  5. Lambda隐式捕获

    auto f1 = [=]{};//对所有局部变量采用值捕获
    auto f2 = [&]{};//对所有捕获变量采用引用捕获
    auto f3 = [=, &a1, &a2];//对a1,a2采用引用捕获,其余采取值捕获
    auto f4 = [&, a1, a2];//对a1,a2采用值捕获,其余采取引用捕获
    
  6. 可变Lambda:一般而言Lambda不会改变捕获变量的值,如果要改变必须加上关键字mutable。变量可不可改变依赖于一样依赖于其是不是const。

    int func(){
        int a = 42;//局部变量
        //对象f2可以改变它捕获的变量的值
        auto f2 = [a] mutable {return a;};
        a = 0;
        auto j = f();//j=43。
    }
    
  7. 指定Lambda的返回类型:一般来说Lambda都能自己都能推断返回类型,但是当返回是在if语句,系统不能自动推断,必须以后置方式给出返回类型。

    int f2 = [a] mutable -> int {if(a>0)return a;else return -a;};
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值