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

C++ Lambda表达式使用

Lambda 表达式基本语法

C++ Lambda 表达式的基本结构如下:

[capture](parameters) -> return_type { body }
  • [capture]:捕获列表,指定外部变量的捕获方式(值捕获、引用捕获等)。
  • (parameters):参数列表,与普通函数参数一致(C++14 支持auto泛型参数)。
  • -> return_type:可选的返回类型声明(省略时由编译器自动推导)。
  • { body }:函数体,实现具体逻辑。

最小 Lambda 示例

auto print = [] { std::cout << "Hello, Lambda!"; }; print(); // 输出:Hello, Lambda!

捕获列表的用法

捕获列表控制 Lambda 访问外部变量的方式:

值捕获(复制变量):

int x = 10; auto lambda = [x] { return x + 1; }; // 捕获 x 的副本

引用捕获(直接操作原变量):

int y = 20; auto lambda = [&y] { y += 5; }; // 修改原变量 y lambda(); // y 变为 25

混合捕获

int a = 1, b = 2; auto lambda = [a, &b] { return a + b; }; // a 值捕获,b 引用捕获

隐式捕获

  • [=]:以值捕获所有外部变量。
  • [&]:以引用捕获所有外部变量。
  • [=, &x]:默认值捕获,仅x引用捕获。

与 STL 算法结合

Lambda 常用于简化 STL 算法的调用,例如std::sortstd::for_each

std::vector<int> nums = {3, 1, 4, 1, 5}; std::sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; }); // nums 变为 {5, 4, 3, 1, 1}

生命周期与悬垂引用风险

若 Lambda 捕获引用且原始变量已销毁,后续调用会引发未定义行为:

std::function<int()> createLambda() { int z = 30; return [&z] { return z; }; // 危险:z 是局部变量 } auto f = createLambda(); f(); // 错误:z 已销毁

性能优化建议

  • 优先使用auto存储 Lambda:避免std::function的间接调用开销。
  • 无捕获 Lambda 可转换为函数指针:适用于 C 接口回调。
  • 避免过度捕获:仅捕获必要变量以减少对象大小。

高级特性(C++14/17)

泛型 Lambda(C++14):

auto adder = [](auto a, auto b) { return a + b; }; adder(3, 4.5); // 返回 7.5

初始化捕获(C++14):

int x = 10; auto lambda = [y = x + 1] { return y; }; // y 初始化为 x + 1

constexprLambda(C++17):

constexpr auto square = [](int n) { return n * n; }; static_assert(square(5) == 25); // 编译期计算


http://www.jsqmd.com/news/961172/

相关文章:

  • 阻抗/LCR测试深度解析:从为什么要测到如何测准
  • 02-Cadence 项目文件夹规范建立:原理图、PCB、封装库和最终文件如何管理
  • 广东开关电源厂家调研:合规资质与定制能力成核心竞争力 - 资讯焦点
  • MgB2参考论文
  • 梭织机振动超标成因及科学隔振治理科普
  • 618 买电视参考热销榜单:海信全渠道量额双冠,RGB-Mini LED 成换代首选
  • Godot游戏资源解包终极指南:3分钟掌握PCK文件提取技巧
  • 五个新的游戏开发挑战
  • SAP ABAP开发实战:手把手教你用GitHub上的AES类搞定银企直连加密
  • AI Agent时代:从零学前端,让你的小游戏和网站自动赚钱(2026实战版)
  • 鸣潮自动化终极指南:5分钟快速上手ok-ww后台自动战斗系统
  • 从IMS轴承数据集到工业预测性维护:一个经典基准的深度解析
  • 遗传算法工程实战:动态架构、自适应参数与工业级避坑指南
  • 2026上海靠谱建装一体公司实力榜单,老房翻新业主实测优选名单 - 资讯焦点
  • 震惊!专业又口碑好的喷绘布,究竟哪家强?
  • 黄冈手表回收包包回收哪家店铺靠谱价格高?26年甄选top榜店铺排行推荐 - 莘州文化
  • 新手必看!电路设计里的‘接地’到底怎么接?单点、多点、混合接地保姆级讲解
  • 当“贵阳制造”遇见“AI大脑”——一场席卷西南的智造风暴
  • 利用快马平台AI快速生成n8n自动化工作流原型,三步搭建集成管道
  • 手把手教你用HackSTLinkUpgrade工具,把淘宝山寨ST-Link固件从V2.J16.S4升到J33.S7
  • 黄南手表回收包包回收哪家店铺靠谱价格高?26年甄选top榜店铺排行推荐 - 莘州文化
  • 大众点评数据采集实战指南:五分钟破解反爬难题的完整方案
  • 按键扫描还放 while 里?难怪你的 STM32 项目越写越卡!
  • 盲盒源码系统小程序V6MAX:潮玩品牌孵化方案 - 壹软科技
  • GEO优化公司怎么选?2026年最新五维评估框架与5家服务商实测指南 - 资讯焦点
  • 从单体到分布式:我用Go重构Python后端,性能提升400%的全链路复盘
  • Hitboxer:彻底解决游戏键盘输入冲突的终极SOCD工具指南
  • 5分钟快速上手NHSE:动物森友会存档编辑终极指南
  • 保姆级教程:在K8s集群内外部署Jenkins,用Pod动态Agent解放你的构建资源
  • 遗传算法进阶:破解早熟收敛与适应度设计陷阱