ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++2.0新特性之lambdas(一)

2022-01-25 13:02:06  阅读:128  来源: 互联网

标签:函数 C++ 编译器 mutable 2.0 id 表达式 lambdas


什么是lambdas?
在2.0中加入lambdas表达式,它允许我们定义出 ‘被用来当成一个参数或者是局部对象的内联函数’。lambdas改变了对标准库的使用。
lambdas最简单的使用方法:
[] {
std::cout<<“hello lambdas”<<std::endl;
}
我们可以通过后面加 ‘()’ 的方式直接调用它:
[] {
std::cout<<“hello lambdas”<<std::endl;
}(); //prints “hello lambdas”
在这里插入图片描述
在这里插入图片描述
这样做难免会有点多此一举,所以大多数情况下我们会像下面这样写:
在这里插入图片描述
上面的书写形式就像是inline一样,我们还可以将lambdas写入一个或多个声明中或是表达式中去。

lambdas的完整形式是这样的:
[…] (…) mutable throwSpec -> retType {…}
下面介绍一下此表达式的各个段的意义:
1,第一段 [ …] 是lambdas表达式的标志性符号,看见 此符号就应该知道,这是lambdas表达式。‘[…]’内可以使用外部变量
2,第二段(…) 里可以放入参数。
3,mutable关系着 […] 里的数据是否可以被改写。
4,throwSpec表示抛出异常。
5,retType 是描述 […] 的返回类型。
6,{…}是函数本体

注意:3,4,5是可选操作,可以都不写,如果都不写的话,(…)可写可不写(前提是没有参数),但是只要三者存在一个,就必须有(…);

在这里插入图片描述
如果想要在函数体内部改变外部变量id的值,就必须加上mutable操作,否则id的值无法改变,编译器会报错。

上述操作也可以看成是仿函数 (形式相同,但不是完全相同):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们明明已经把id变为22了,为什么输出结果还是0,1呢?
因为传参是值传递,在编译时编译器发现id初始值为0,所以编译器进行了优化,将变量优化成了常变量0,所以后面函数体内的id都是从0开始加起,与外部id的值无关。

在这里插入图片描述
当参数是引用时mutable操作可写可不写

在这里插入图片描述
当我们将参数变为引用传递时就会发现,外部id变化的同时lambdas内部id的值也会变化,这就是引用传参。

标签:函数,C++,编译器,mutable,2.0,id,表达式,lambdas
来源: https://blog.csdn.net/qq_48168706/article/details/122676893

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有