一分钟学会C++ Lambda表达式使用

🐻1. C++ Lambda 表达式详解

Lambda 表达式是 C++11 引入的一种可调用对象,可以像函数一样使用,但无需单独定义函数。它本质上是一个匿名的函数对象(即闭包),允许在局部作用域内定义功能,并捕获其周围作用域的变量。Lambda 极大地提高了 STL 算法、回调函数、并发编程等场景的表达力。

🦣2. Lambda 基本语法

各部分说明:

  • [capture]:捕获列表,指定如何捕获外部变量(传值、传引用等)。
  • (parameters):参数列表,与普通函数相同(C++14 起可用auto实现泛型)。
  • -> return_type:返回类型(可省略,编译器自动推导)。
  • {}:函数体。

最简单的 lambda:[]{},不捕获、无参数、无返回值。

👉3. 示例1:与 STL 算法配合

🦩4. 捕获列表详解

捕获列表决定了 Lambda 表达式可以访问哪些外部变量,以及如何访问。

⚠️注意:

  • 默认值捕获[=]捕获的变量是只读的(除非使用mutable)。
  • 捕获引用时,必须确保 lambda 执行时被引用的变量仍然存活,否则会产生悬垂引用。

👉5. 示例2:捕获局部变量

🐫6. 延迟调用与生命周期

Lambda 表达式是一个临时对象,可以赋值给std::functionauto变量,并可以在其捕获的变量作用域之外调用。例如:

⚠️但若捕获引用且原始变量已销毁,调用 f 将是未定义行为,会导致程序异常退出。

🐸7. 性能分析

  • 无捕获的 lambda可以隐式转换为函数指针,性能与普通函数相同。
  • 捕获少量变量:编译器会生成一个匿名的函数对象,大小与捕获的变量之和相当,但通常内联展开,开销很小。
  • 使用std::function包装lambda可能带来额外的堆分配和间接调用开销,除非必要,否则优先使用auto存储。

🐢8. 常见陷阱与注意事项

  1. 捕获引用导致的悬垂引用,如下例子

  1. mutable影响
    值捕获的变量如果不加mutable则是只读的,但如果你只是想修改副本,记得加mutable
  2. 默认捕获[=]可能意外拷贝大对象
    若只访问个别成员,用显式捕获列表[&, obj]更清晰和高效些。
  3. std::function与性能
    std::function可能带来类型擦除开销,尽量使用auto存储lambda

🔚🔸🔸🔸

🧑💻我是著名MYCPC++高并发通讯框架开源项目、和WordBN字远笔记共享软件作者。

👉待过多家上市公司软件总监,技术总监。拥有超20年C++、QT/QML开发经验。早期🌎互联网行业出身,做过企业即时通讯、区块链等大型项目。目前在做🧭机器视觉智能制造行业,如无序抓取,3D仿真,🌟缺陷检测,上位机软件,硬件控制和通讯等。🪐精通跨平台应用开发,高并发,系统架构,☀️性能优化,进程间通讯,RTP通讯,IM即时通讯,音视频编解码等。👈

🛠️业余无事写写免费软件。如有软件开发、外包、定制等合作需求,欢迎私信咨询🌹

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容