当前位置: 首页 > news >正文

侯捷 C++ 课程学习笔记:进阶语法之lambda表达式(二)

侯捷 C++ 课程学习笔记:进阶语法之lambda表达式(二)


一、捕获范围界定

在这里插入图片描述

1. 局部变量与函数参数

  • 非静态局部变量:Lambda 所在作用域内定义的局部变量(如函数内部的 int x)会被完整复制其当前值。捕获后外部变量的后续修改不影响 Lambda 内部的值。
  • 函数参数:Lambda 所在函数的形参(如 void func(int param) 中的 param)同样按值捕获,行为与局部变量一致。

2. 类的成员变量

  • 隐式捕获 this 指针:当 Lambda 定义在类的成员函数中时,[=] 会隐式捕获 this 指针,允许通过 this 访问成员变量(如 this->data)。
  • 实时访问特性:成员变量的值在 Lambda 执行时动态获取,而非定义时的快照。若外部修改了成员变量,Lambda 内部访问的是最新值。

3. 块作用域变量

  • 代码块内变量:在 {} 代码块中定义的变量(如循环或条件分支内声明的 int y)也属于捕获范围,行为与局部变量相同。

二、不捕获的变量类型

1. 全局变量与静态变量

  • 全局变量:直接访问全局作用域的变量(如 int global_var),无需捕获。
  • 静态局部变量:函数内定义的 static int x 不会被捕获,Lambda 直接访问其内存地址。

2. 未使用的变量

  • 编译器优化:即使使用 [=],未在 Lambda 函数体中实际使用的外部变量会被自动忽略,不执行捕获操作。

三、关键注意事项

1. 值捕获的瞬时性

  • 快照机制:捕获的变量值在 Lambda ​定义时生成副本,后续外部修改不影响内部副本(例如外部将 x 从 5 改为 10,Lambda 内部仍使用 。

2. 成员变量的特殊风险

  • 悬垂指针问题:若 Lambda 被传递到类对象生命周期之外(如跨线程调用),隐式捕获的 this 指针可能指向已销毁的对象,导致未定义行为。

3. 隐式捕获的局限性

  • 全局变量不可控:由于全局变量未被捕获,其值的变化会直接影响 Lambda 执行结果,可能引发意外副作用。

四、最佳实践建议

1. 显式捕获策略

  • 优先显式列出变量:使用 [x, &y] 而非 [=][&],明确控制捕获方式,提升代码可读性和安全性。

2. 生命周期管理

  • 智能指针辅助:对可能跨生命周期的 Lambda,使用 shared_ptrweak_ptr 管理资源,避免悬垂指针问题。

3. 混合捕获优化

  • 组合捕获模式:灵活搭配 [=, &counter](大部分变量按值捕获,仅 counter 按引用)或 [&, id](大部分按引用,仅 id 按值),平衡性能与安全性。

4. 避免隐式全捕获

  • 减少隐式依赖:禁用 [=][&] 的全捕获方式,防止意外捕获无关变量导致性能损耗或逻辑错误。

五、典型场景对比

场景推荐捕获方式风险提示
短暂回调函数[x] 显式值捕获避免拷贝大对象
跨线程异步任务[sp=make_shared]防止 this 指针失效
STL 算法参数[&] 局部引用捕获确保变量生命周期覆盖算法执行
成员函数内逻辑封装[this, x]显式分离成员与局部变量
侯捷C++课程学习笔记Lambda表达式
捕获范围界定
不捕获的变量类型
关键注意事项
最佳实践建议
典型场景对比

相关文章:

  • 利用8个参数定义一个汽轮机,然后根据这8个参数生成汽轮机性能试验时的测点清单-pycharm-源代码(适用所有类型汽轮机)
  • 【搜索页】- 功能流程
  • OpenHarmony-SELinux配置
  • 【git】 Could not read from remote repository.
  • 【Linux】线程池、单例模式、死锁
  • Python爬虫:从人民网提取视频链接的完整指南
  • 练习-纪律问题(幂运算)
  • react__jsx语法
  • Angular由一个bug说起之十四:SCSS @import 警告与解决⽅案
  • 【Godot4.0】EasyClock时钟组件
  • 自动同步多服务器下SQL脚本2.0
  • Python:函数式编程
  • 达梦数据库中插入导出图片的方法与应用
  • uniapp+微信小程序+最简单局部下拉刷新实现
  • 看不见的“健康杀手”来袭,微塑料竟威胁人体与植物光合作用
  • 多肽纯度如何选择?
  • 【2步解决】phpstudy开机自启(自动启动phpstudy、mysql、nignx或apache、自动打开网址)
  • 自学Java-Java高级技术(单元测试、反射、注解、动态代理)
  • 深度迁移学习实战指南:从理论到产业级应用
  • Windows Wise Care 365 PRO-中文便携版
  • 建立双城双向科创项目孵化机制,2025沪港创新项目评选启动
  • 国台办:不管台湾地区领导人讲什么,都改变不了台湾是中国一部分的地位和事实
  • 国家统计局答澎湃:我国投资的潜力依然巨大,支撑投资增长的有利因素仍然比较多
  • 罗马教皇利奥十四世正式任职
  • 国宝归来!子弹库帛书二、三卷抵达北京
  • 女排奥运冠军宋妮娜:青少年保持身心健康才能走得更远