首页 > 后端开发 > C++ > 正文

c++中的lambda捕获列表详解_c++值捕获与引用捕获【C++11】

尼克
发布: 2025-12-20 10:09:08
原创
254人浏览过
捕获列表决定外部变量以值或引用方式进入lambda作用域:[x,y]为值捕获(独立副本),[&x,&y]为引用捕获(共享原变量),混合写法如[x,&y]支持灵活组合,[this]用于类内访问成员。

c++中的lambda捕获列表详解_c++值捕获与引用捕获【c++11】

捕获列表的基本写法和作用

lambda表达式的捕获列表位于方括号 [] 中,用于说明函数体中要使用的外部变量如何“带进来”。它决定了这些变量是以副本(值捕获)还是以别名(引用捕获)的方式进入 lambda 作用域。没有正确理解捕获方式,容易引发悬空引用、未定义行为或意外的修改。

值捕获:复制一份,彼此独立

用变量名直接写在捕获列表中,如 [x, y],表示对 x 和 y 进行值捕获——编译器在 lambda 创建时拷贝它们的当前值。之后无论原变量怎么变,lambda 内部看到的始终是快照时刻的副本。

  • 适合只读使用、生命周期短、或者需要隔离状态的场景
  • 捕获 const 变量时,lambda 内部也默认为 const(除非用 mutable 修饰)
  • 大对象值捕获可能带来额外开销;可考虑 move 捕获([x = std::move(x)])来转移所有权

引用捕获:共享同一份数据

在变量名前加 &,如 [&x, &y],表示引用捕获。lambda 内部操作的就是原始变量本身,任何修改都会反映到外部作用域。

  • 必须确保 lambda 的生命周期不超过被引用变量的生命周期,否则访问悬空引用 → 未定义行为
  • 适合需要修改外部变量,或对象太大不宜拷贝的情况
  • 慎用 [&](隐式全引用捕获),容易意外绑定局部变量,尤其在返回 lambda 时极危险

混合捕获与特殊写法

一个 lambda 可同时使用值捕获和引用捕获,但需注意顺序:引用捕获不能出现在值捕获之后(C++11 起已允许混合,但语义清晰更重要)。

立即学习C++免费学习笔记(深入)”;

  • [x, &y]:x 值捕获,y 引用捕获 —— 最常见且推荐的显式组合
  • [=, &y]:默认值捕获所有可见变量,但 y 显式指定为引用(y 不能在 = 中重复出现)
  • [&, x]:默认引用捕获所有,但 x 显式值捕获(x 在 & 中不参与引用绑定)
  • [this]:捕获当前对象的 this 指针,用于类内 lambda 访问成员(注意 this 是指针,不是对象)
基本上就这些。捕获的本质是控制变量的“可见性”和“生命周期归属”,选值还是引用,关键看你要不要同步变化、能不能保证引用有效、以及是否在意拷贝成本。

以上就是c++++中的lambda捕获列表详解_c++值捕获与引用捕获【C++11】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号