值捕获[x]复制变量副本,引用捕获[&x]绑定原始变量;[=]和[&]隐式捕获实际使用的变量,混合捕获需显式声明;引用捕获易致悬垂,应优先值捕获或用shared_ptr。

值捕获:用 [x] 复制变量副本
最直接的方式是显式列出变量名,比如 [x]。Lambda 创建时会调用 x 的拷贝构造函数(或移动构造,若适用),把值存为内部成员。后续对原始 x 的修改完全不影响 Lambda 内部的副本。
-
x是基本类型(如int)时,就是简单赋值;是类类型时,触发拷贝/移动构造 - 默认情况下,
operator()是const的,所以不能在函数体内修改捕获的x - 若需修改副本,必须加
mutable:[x]() mutable { x = 42; }—— 注意这只是改副本,原始变量不变
引用捕获:用 [&x] 直接绑定原始变量
加 & 表示按引用捕获,Lambda 内部操作的就是原始变量本身。这能避免拷贝开销,也支持修改外部状态,但风险极高。
- 必须确保 Lambda 执行时,
x仍存活。常见坑:在函数返回前定义 Lambda 并返回它,而x是栈上局部变量 → 执行时引发未定义行为 - 不需要
mutable:引用天然可写,[&x]() { x++; }直接修改原始x - 若捕获多个变量,写成
[&a, &b, &c],不能混用&和无修饰符
[=] 和 [&] 的隐式捕获规则
[=] 不是“捕获所有局部变量”,而是“捕获所有在 Lambda 体中实际被使用的、可访问的非静态局部变量和函数参数”,以值方式复制;[&] 同理,但按引用。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
[=]在类成员函数中会隐式捕获this指针(不是成员变量本身),因此能访问member_var,但访问的是当前对象的成员,不是快照 - 静态局部变量、全局变量、
constexpr变量不参与隐式捕获——它们本就可在作用域内直接访问 - 混合捕获必须显式:比如
[=, &y]表示其余全按值,仅y按引用;[&, x]表示其余全按引用,仅x按值
悬垂引用和生命周期错配是最难 debug 的问题
引用捕获本身语法简单,但错误往往在运行时才暴露,且表现随机。比如把 [&x] 存进容器、传给异步任务,而 x 在 Lambda 执行前已析构——这时读写 x 就是野指针行为。
立即学习“C++免费学习笔记(深入)”;
- 优先考虑值捕获,除非有明确性能需求或需要副作用
- 若必须用引用,确认 Lambda 的生命周期严格短于被引用变量的生命周期
- 用
std::shared_ptr包裹数据并值捕获智能指针,是更安全的共享方案

















