捕获列表决定外部变量以值或引用方式进入 lambda 作用域:[x,y]为值捕获(独立副本),[&x,&y]为引用捕获(共享原变量),混合写法如 [x,&y] 支持灵活组合,[this]用于类内访问成员。

捕获列表的基本写法和作用
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 是指针,不是对象)
基本上就这些。捕获的本质是控制变量的“可见性”和“生命周期归属”,选值还是引用,关键看你要不要同步变化、能不能保证引用有效、以及是否在意拷贝成本。
以上就是