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

devtools/2025/3/14 1:51:53/

侯捷 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表达式
捕获范围界定
不捕获的变量类型
关键注意事项
最佳实践建议
典型场景对比

http://www.ppmy.cn/devtools/166911.html

相关文章

深度学习 常见优化器

一、基础优化器 随机梯度下降(SGD) • 核心:∇θJ(θ) η * ∇θJ(θ) • 特点:学习率固定,收敛路径震荡大 • 适用场景:简单凸优化问题 • 改进方向:动量加速 二、动量系优化器 2. SGD with…

onlyoffice 8.1.0 社区版去除20连接限制版(添加常用中文字体,解锁手机编辑连接器,包含ARM64)

onlyoffice社区版Community Server是根据GNU Affero通用公共许可证发行的ONLYOFFICE的免费下载开源版本。 但该版本限制了最大连接数量为20,超出之后只能预览不能编辑。并删除了移动端编辑功能。 根据AGPL许可协议,在遵守AGPL许可协议的前提下&#xff…

DeepSeek开启AI办公新模式,WPS/Office集成DeepSeek-R1本地大模型!

从央视到地方媒体,已有多家媒体机构推出AI主播,最近杭州文化广播电视集团的《杭州新闻联播》节目,使用AI主持人进行新闻播报,且做到了0失误率,可见AI正在逐渐取代部分行业和一些重复性的工作,这一现象引发很…

设计模式文章汇总-Golang语言实现

Golang学习笔记_27——单例模式 Golang学习笔记_28——工厂方法模式 Golang学习笔记_29——抽象工厂模式 Golang学习笔记_30——建造者模式 Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 Golang学习笔记_33——桥接模式 Golang学习笔记_34——组合模式 Gola…

【面试题系列】Redis 常见面试题答案

一、基础概念 1. Redis 有哪些数据结构?各自的应用场景是什么? 答案: Redis 支持以下数据结构: String:最基础类型,存储字符串、数字、二进制数据。 场景:缓存用户信息、计数器、分布式锁。H…

并发操作的同步_第四章_《C++并发编程实战》笔记

并发操作的同步 1. 等待事件或等待其他条件2. 基于条件变量的生产者 - 消费者模型3. 超时等待4. std::future 和 std::promise核心概念代码 5. std::packaged_task 和 std::async核心概念 6. 多选题目6. 多选题目答案7. 设计题目7.1 设计一个线程安全的缓存系统7.2 实现可取消的…

Matlab:矩阵运算篇——矩阵数学运算

目录 1.矩阵的加法运算 实例——验证加法法则 实例——矩阵求和 实例——矩阵求差 2.矩阵的乘法运算 1.数乘运算 2.乘运算 3.点乘运算 实例——矩阵乘法运算 3.矩阵的除法运算 1.左除运算 实例——验证矩阵的除法 2.右除运算 实例——矩阵的除法 ヾ( ̄…

前端系统测试(单元、集成、数据|性能|回归)

有关前端测试的面试题 系统测试 首先,功能测试部分。根据资料,单元测试是验证最小可测试单元的正确性,比如函数或组件。都提到了单元测试的重要性,强调其在开发早期发现问题,并通过自动化提高效率。需要整合我搜索到的资料中的观点,比如单元测试的方法(接口测试、路径覆…