初探C++ lambda表达式

目录

目前仅仅做一下简单的研究。

为什么要用lambda表达式

  1. 有些时候C++函数无法使用的地方,lambda表达式依然可以使用,而且更方便简洁。
  2. 有的函数不好命名字,或者怕重名,或者懒得命名字。
  3. 将lambda表达式引入后更加简洁,增强了代码的可读性。
  4. 引用知乎:详细来说就是,在最适合lambda表达式的场景,如果你一定要用class表达,那么你需要为你的类定义一个十分臃肿的构造函数,传进去一大堆参数,然后返回一个值就把这个对象扔了。然而用lambda表达式的话,你只要把这些捕获为闭包就行了。

lambda表达式的格式

一个完整的lambda表达式的组成如下:

[ capture-list ] ( params ) mutable(optional) exception(optional) attribute(optional) -> ret(optional) { body }

1.capture-list:捕获列表。
2.params:和普通函数一样的参数。
3.mutable:只有这个 Lambda 表达式是 mutable 的才允许修改按值捕获的参数。
4.exception:异常标识。
5.attribute:属性标识。暂时不必理解。
6.ret:返回值类型,可以省略,让编译器通过 return 语句自动推导。
7.body:函数的具体逻辑。

或者可以简单去看

[变量使用说明符号](参数列表) -> 返回值数据类型

{

// 函数体

}

lambda的捕获方式

[]        //不捕获任何外部变量
[x]       //x 按值捕获
[&]       //任何外部变量都隐式按引用捕获
[=]       //任何外部变量都隐式按值捕获
[x, &y]   //x 按值捕获, y 按引用捕获.
[&, x]    //x显式地按值捕获. 其它变量按引用捕获
[=, &z]   //z按引用捕获. 其它变量按值捕获
[this]    // 按值捕获当前对象

值捕获:在lambda表示创建的时候变量被拷贝,不是在调用的时候被拷贝;值捕获不能改变捕获的值,除非用mutable 允许拷贝副本被修改,mutable加在参数列表后面。
引用捕获:可以改变外部变量; 但有可能出现悬挂引用(Dangling reference)必须保证lambda 调用时,捕获引用变量依然有效

lambda的参数列表

它的参数列表跟普通函数的参数列表类似,主要用于接收STL算法传递进来的数据,所以其参数的个数由具体的算法决定,而参数的类型则由容器中所保存数据的类型决定,至于参数的传递形式,到底是传值还是传引用,则由我们是否需要修改容器中的数据决定。例如,Lambda表达式应用在for_each()算法中,这就决定了它只能有一个参数,用以接收算法传递给它的单个数据;而容器中保存的是int类型的数据,所以参数的类型也应该是int类型。至于参数的传递方式,如果我们需要修改容器中的数据,就使用传引用方式,否则直接使用传值方式。

int main() {
    auto y = [](int a, int b) {
        return a + b;
    };
    std::cout << y(3, 2); // >: 5
}

从参数列表开始,后面都是可选项,可根据实际情况不需要的话直接省去

int main() {
    auto empty = [] {
        std::cout << "Wow!空的~" << std::endl;
        // 啥也没有只有个函数体};
    };
    empty(); // >: Wow!空的~
}

作者:世间事无常
链接:https://zhuanlan.zhihu.com/p/206680592
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值