c++ 11 lambda表达式

本文深入介绍了C++中的Lambda表达式,包括其语法结构、捕获列表(按值、按引用)、参数、返回值类型以及如何指定和使用lambda表达式的名称。通过示例展示了不同捕获方式对变量的影响,并探讨了mutable关键字的作用。此外,还提及了lambda表达式的自动返回类型推断及其限制。最后,通过实例解释了按值和按引用捕获的区别。
摘要由CSDN通过智能技术生成

lambda表达式的语法形式:

[ capture ] ( params ) opt -> ret { body; };

[capture](parameters) mutable ->return-type{statement}

        其中carpture是捕获列表,params是参数,opt是选项,ret则是返回值的类型,body则是函数的具体实现。

        1.捕获列表描述了lambda表达式可以访问上下文中的哪些变量。

[] :表示不捕获任何变量

[=]:表示按值捕获变量

[&]:表示按引用捕获变量

[this]:值传递捕获当前的this

[=, &x]:混合捕获 变量x以引用形式捕获,其余变量以传值形式捕获(注意顺序不能变,=符号一定要在前面)

[&, x]: 混合捕获 变量x以值的形式捕获,其余变量以引用形式捕获(注意顺序不能变,&符号一定要在前面)


上面这种捕获是不允许的,=表示按值的方式捕获所有的变量,x相当于被重复捕获了。        但是捕获列表不允许变量的重复传递:例如 [=,x]

        2.params表示lambda的参数,用在{}中

        3.opt表示lambda的选项,例如mutable,后面会介绍一下mutable的用法。

        4.ret表示lambda的返回值,也可以显示指明返回值,lambda会自动推断返回值,但是值得注意的是只有当lambda的表达式仅有一条return语句时,自动推断才是有效的。像下面这种的表达式就需要加上返回类型。

        [](double x )->double{int y = x ;return x - y;};

虽然lambda表达式是匿名函数,但是实际上也可以给lambda表达式指定一个名称,如下表示

        auto f = [](int x ){return x % 3 ==0;};

此后再需要使用该lambda表达式,就可以使用f()来代替。举一个例子:

        #include <iostream>
using namespace std;
int main()
{
    int a = 5,b = 6;
    auto f = [=]{return a+b;};//[=]按值捕获了a和b
    cout << f() << endl;
    return 0;
}
        按值捕获和按引用捕获

按值捕获和按引用捕获的用法通过下面这个例子来看一下。

#include <iostream>
using namespace std;
int main()
{
    int a = 5;
    auto f1 = [=]{return a+1;};//按值捕获a
    auto f2 = [&]{return a+1;};//按引用捕获a
    cout << f1() << endl;
    cout << f2()<< endl;
    a++;
    cout << f1() << endl;
    cout << f2() << endl;
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值