C++ lambda表达式
发布时间:2021-08-15 栏目:C++ 评论:0 Comments
lambda表达式是C++11中引入的,lambda表达式又称匿名函数Anonymous function,其构造了一个可以在其作用范围内捕获变量的函数对象。通常它作为一个参数传递给接收函数指针或者函数符的函数使用。在C++的STL算法使用过程中,经常可以看到它的身影。
lambda表达式实际为一个仿函数functor,编译器后会生成一个匿名类(注:这个类重载了()运算符)
与普通函数指针相比,Lambda表达式可以包含数据成员,也就是说它是可以有状态的。
2、lambda表达式的优势
1)遵守就近原则:随时定义随时使用,lambda表达式的定义和使用在同一个地方,并且lambda表达式可以直接在其他函数中定义使用,其他函数没有这个优势。
2)简洁明了:lambda表达式相比较其他函数的更加的简洁明了。
3)效率相对高些:lambda表达式不会阻止编译器的内联,而函数指针则会阻止编译器内联。
4)捕获动态变量:lambda表达式可以捕获它可以访问的作用域内的任何动态变量。
3、lambda表达式基本语法
[capture list] (params list) mutable exception-> return type { function body }
表达式中各个参数的含义如下:
[capture list]:捕获外部变量列表
(params list):形参列表
mutable:表示能不能修改捕获的变量
exception:异常设定
return type:返回类型
function body:函数体
虽然lambda中的参数变量很多,通常情况下并不需要把每一个都使用上,根据自己的需要使用即可,大多数情况下可以直接省略->、mutable、exception,不需要返回类型的话也可以省略return type。一个简单的lambda表达式:[](int x){return x*x;}。
4、lambda表达式捕获外部变量方法
1)参数以值传递方式被捕获:参数以值传递的方式传入到lambda表达式中,值传递方式参数在lambda表达式中值不能被修改。
2)参数引用传递方式被捕获:参数以引用的方式传入到lambda表达式中,引用传递方式参数在lambda表达式内部修改和表达式外部的修改会相互影响。
3)表达式自行推导捕获:当捕获列表[capture list]中不传入任何变量而是写成[=]或者[&],lambda表达式会以值传递[=]或[&]引用传递的方式捕获参数,参数的捕获根据表达式中变量使用情况来推导。
参考:https://blog.csdn.net/toby54king/article/details/105127327
留下评论
You must be logged in to post a comment.
近期评论
- Pika发表在《莫里斯蠕虫(Morris Worm)》
- Pika发表在《多组学科研分析》
- crisy发表在《最近关于专利的一点感想》
- walter发表在《机器学习基础知识回顾-马尔科夫过程(Markov Process)》
文章归档
- 2024年3月
- 2024年2月
- 2023年12月
- 2023年11月
- 2023年10月
- 2023年9月
- 2023年8月
- 2023年7月
- 2023年6月
- 2023年5月
- 2023年4月
- 2023年3月
- 2023年2月
- 2023年1月
- 2022年12月
- 2022年11月
- 2022年9月
- 2022年8月
- 2022年7月
- 2022年6月
- 2022年5月
- 2022年3月
- 2022年2月
- 2022年1月
- 2021年12月
- 2021年11月
- 2021年10月
- 2021年9月
- 2021年8月
- 2021年7月
- 2021年6月
- 2021年5月
- 2021年4月
- 2021年2月
- 2021年1月
- 2020年12月
- 2020年11月
- 2020年10月
- 2020年8月
- 2020年7月
- 2020年6月
- 2020年5月
- 2020年4月
- 2020年3月
- 2020年2月
- 2019年7月
- 2019年5月
- 2019年3月
- 2019年1月
- 2018年6月
- 2018年5月
- 2018年4月
- 2018年3月
- 2018年2月
- 2017年11月
- 2017年7月
- 2017年6月
- 2017年5月
- 2017年3月
- 2016年12月
- 2016年11月
- 2016年10月
- 2016年9月
- 2016年8月
- 2016年7月
- 2016年6月
- 2016年5月
- 2016年4月
- 2016年3月
- 2016年2月
- 2016年1月
- 2015年12月
- 2015年11月