lambda表达式必须包含捕获列表和函数体,缺一不可;[]{}是最小合法形式,参数列表和返回类型可省略但有规则,值捕获需mutable才可修改,引用捕获须严防悬垂。

lambda 表达式必须包含捕获列表和函数体
缺一不可。哪怕什么都不捕获、什么都不做,也得写成 [] {};只写 {} 或 () 都是语法错误。捕获列表 [...] 是 lambda 的“身份标识”,编译器靠它区分普通代码块和闭包对象;函数体 {...} 是执行逻辑的唯一落点,空大括号 {} 也是合法的。
参数列表和返回类型大多能省略,但有隐含规则
无参时可省略 ()(C++14 起),写成 [] { ... } 即可;但若带参数,() 必须显式写出,如 [](inta) { ... }。返回类型通常不用写——单个 return 语句时编译器自动推导;但遇到多分支、不同 return 类型或需要强制转为特定类型(比如返回 bool 而非 int)时,必须用 -> bool 这类形式显式声明。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
值捕获变量默认只读,改之前得加 mutable
这是新手最常踩的坑:写 [x]() { x = 42; } 会编译失败,因为按值捕获的变量在 lambda 内部被视为 const。要修改,必须加上 mutable 关键字:[x]() mutable { x = 42; }。注意这只会修改 lambda 自己拷贝的那一份 x,不影响外部原始变量。
引用捕获要注意生命周期,别让 lambda 持有悬垂引用
写 [&x]() { return x; } 看似省事,但如果这个 lambda 在 x 生命周期结束后才被调用(比如存到容器里、传给异步任务),就会访问非法内存。常见于局部变量 + 线程/回调场景。安全做法是:优先值捕获;必须引用时,确保 lambda 的生存期不长于被引用对象,或改用智能指针管理所有权。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










