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

【Effective Modern C++】第六章 lambda表达式:32. 使用初始化捕获来移动对象到闭包

C++11 lambda 的捕获短板

我们知道 C++11 的 lambda 只有按值捕获按引用捕获两种方式,但这两种方式都有局限,满足不了一些特殊场景:

  1. 对于只能移动、不能拷贝的对象,比如std::unique_ptrstd::future,C++11 根本没法把它们放进闭包;
  2. 对于拷贝成本很高的对象(比如大容器std::vector),我们只想移动进闭包节约开销,C++11 也做不到,只能被迫拷贝。

这是 C++11 lambda 设计上的一个明显缺陷,而 C++14 直接补上了这个短板。

C++14 的完美解决方案:初始化捕获(init capture)

C++14 引入了初始化捕获,也叫通用 lambda 捕获,它的灵活性极强,移动捕获只是它的核心用法之一,甚至能直接在捕获里创建对象,完全覆盖了 C++11 捕获的功能,还能做更多事。

1. 初始化捕获的语法逻辑
[闭包内的数据成员名 = 初始化表达式]
  • 等号左侧:是 lambda 闭包类里自定义的数据成员名称;
  • 等号右侧:是初始化这个成员的表达式,可以是移动、函数调用、临时对象等。

两者作用域不同:左侧属于闭包类,右侧是 lambda 定义的外部作用域。

2. 两种经典使用场景
  1. 把已有对象移动进闭包
auto pw = std::make_unique<Widget>(); // 将pw移动到闭包中,而非拷贝 auto func = [pw = std::move(pw)] { return pw->isValidated() && pw->isArchived(); };
  1. 直接在捕获里创建对象(连局部变量都不用)
auto func = [pw = std::make_unique<Widget>()] { return pw->isValidated() && pw->isArchived(); };

C++11 没有初始化捕获?两种模拟移动捕获的方法

如果编译器只支持 C++11,没法用初始化捕获,也能实现近似的移动捕获效果。

1. 手写仿函数类

lambda 本质就是编译器生成的闭包类,那我们可以手动写一个类,在构造函数里把对象移动到成员变量中,重载operator()实现 lambda 的逻辑,效果完全一致。

2. 用std::bind模拟(更实用、更常用)

这是 C++11 模拟移动捕获的主要思路:

  • 先把要移动的对象移动构造std::bind生成的绑定对象里(bind 会对右值参数做移动构造);
  • 再让 lambda 以引用的方式,使用 bind 对象里存储的这个移动后的对象;
  • bind 对象的生命周期和闭包绑定,完全不用担心悬空问题。

比如移动vector进闭包的写法:

std::vector<double> data; // 填充data... auto func = std::bind( [](const std::vector<double>& data) { /* 使用闭包内的data */ }, std::move(data) // 先移动到bind对象中 );

总结

  1. C++14 环境下,直接用初始化捕获把对象移动到闭包中,简洁又安全;
  2. C++11 没有初始化捕获,就通过手写仿函数类或者std::bind的方式,模拟实现移动捕获的效果。

原著在线阅读地址

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

相关文章:

  • 2026年Java视觉AI趋势:YOLO26与Transformer架构的融合探索
  • 2026年杭州苹果售后维修点推荐:专业服务趋势评测,涵盖应急与日常维修核心痛点 - 十大品牌推荐
  • 2026年评价高的液压合页/生态门液压合页如何选畅销厂家采购指南 - 行业平台推荐
  • 救命神器! 降AI率软件 千笔 VS 学术猹,专科生必备!
  • 2026年成都苹果售后维修点推荐:办公居家场景深度评测,直击配件与数据安全痛点 - 十大品牌推荐
  • 北京NOMOS手表去哪修?2026年北京NOMOS手表维修推荐与评价,解决网点与质保核心痛点 - 十大品牌推荐
  • 2026年知名的无尘车间净化铝型材/包边净化铝型材实用供应商采购指南如何选 - 行业平台推荐
  • 2026年质量好的抽屉滑轨/橱柜抽屉滑轨人气实力厂商推荐 - 行业平台推荐
  • 腕表维修服务哪家强?2026年北京GP芝柏表手表维修推荐与排名,解决网点覆盖与质保时长痛点 - 十大品牌推荐
  • 基于 Thinkphp和Laravel框架 的实践性活动教学毕业论文选题系统
  • 2026年靠谱的珠宝缓冲滑轨/衣柜缓冲滑轨可靠供应商参考推荐几家 - 行业平台推荐
  • 回收永辉超市购物卡,现金秒到账! - 团团收购物卡回收
  • 南通苹果维修点哪个靠谱?2026年南通苹果售后维修点推荐与排名,解决技术专业性与可靠性痛点 - 十大品牌推荐
  • 警惕AI钝化思维能力与应对策略
  • 腕表维修中心哪家专业?2026年北京WEMPE手表维修排名与推荐,解决配件与工艺痛点 - 十大品牌推荐
  • 2026年比较好的ABB变频器/变频器安装如何选生产商推荐(精选) - 行业平台推荐
  • 2026年南昌苹果售后维修点推荐:基于专业能力评价,针对效率与透明消费痛点指南 - 十大品牌推荐
  • 如何为不同场景选维修点?2026年南京苹果售后维修点全面评测与推荐,直击技术与便利痛点 - 十大品牌推荐
  • 永辉超市购物卡回收技巧,全网最优价! - 团团收购物卡回收
  • 盒马鲜生购物卡闲置?教你高价回收! - 团团收购物卡回收
  • xxl-job 和 elastic-job,哪个更好?
  • 2026年热门的伺服中空旋转平台/高精密中空旋转平台实力厂家推荐如何选 - 行业平台推荐
  • 一款开源的可视化管理神器,让应用容器化快到飞起!
  • 如何选择可靠的手机维修点?2026年赣州苹果售后维修点评测与推荐,解决质量与信任痛点 - 十大品牌推荐
  • 2026年杭州有实力的GEO优化公司推荐,GEO优化服务/GEO优化AI工具排名/GEO服务,GEO优化源头厂家哪家好 - 品牌推荐师
  • 建议收藏|自考必备降AIGC网站 千笔·降AIGC助手 VS 学术猹
  • 2005-2025年我国逐日最高气温栅格数据
  • 2026年热门的酚醛胶怎么选真实参考销售厂家参考 - 行业平台推荐
  • 郑州苹果维修点哪家服务好?2026年郑州苹果售后维修点推荐与排名 - 十大品牌推荐
  • Qwen-Ranker Pro与GitHub代码搜索的语义增强方案