lambda

lambda表达式本质上是一个匿名函数对象,与普通函数相比,它可以定义在函数内部,使用方面而言没有类型,一般是用auto或者模板参数定义的对象来接受返回值
lambda表达式的格式为[捕获列表](参数)->返回值类型{函数体}

[捕获列表]:总是出现在lambda函数的开始位置,编译器会将[]作为判断lambda函数的依据,可以为空,但是不能省略
(参数列表):相当于普通函数的参数列表,没有则可以省略
->返回值类型:箭头和返回值类型是一体的,可以省略,返回值类型没有,或者由编译器推导
{函数体}:与普通函数类似,可以使用参数列表的变量,也可以使用捕获列表的变量
最简形式为[]{},这两个是不能省略的
    []{};//最简形式 []{}

    [](){
        cout << "无捕获无参数lambda" << endl;
    }();//无捕获、无参数、无返回值

    auto add = [](int a, int b){
        return a + b;
    };//无捕获、带参数、省略返回值推导
    cout << add(10, 20) << endl;//调用add函数

    int x = 100;
    auto addadd = [x](int a, int b)->int{
        return x + a + b;
    };//完整格式:捕获列表 + 参数列表 + 指定返回值
    cout << addadd(5, 6) << endl;//调用addadd函数

    return 0;
仿函数同样可以在函数体中调用,且可以持久化保持数据状态
lambda表达式可以在大多数情况下替代仿函数,只有在多个类中需要频繁调用且保留数据状态的的代码建议使用仿函数
lambda表达式可以像变量表达式一样作为函数参数,这是最常用的用法

捕获列表

捕获列表分为显式和隐式
显式捕获分为传值捕捉和传引用捕捉,不同变量可以使用不同的捕捉方式
隐式捕获是直接在捕获列表写一个=或&,分别表示直接捕获或引用捕获,使用了哪些变量,便会捕获哪些变量
混合捕获则是二者都有,但是隐式捕获只能有显式或隐式一个,并且必须放在捕获列表第一个
捕获列表默认为const,可以通过mutable取消,从而修改捕获对象,但只能修改形参,不影响原值,加了mutable后参数列表()不可省略

lambda原理

与范围for循环本质是迭代器类似,lambda表达式本质是仿函数,进行了()重载,

更多推荐