Lambda 表达式的完整语法[capture](params)mutable-return_type{body}各部分都可以省略形成不同写法1. 最简形式无捕获、无参数autof[]{return42;};std::coutf();// 输出 422. 带参数autoadd[](inta,intb){returnab;};std::coutadd(1,2);// 输出 33. 显式指定返回类型当返回类型无法自动推导或想明确时// C11 风格尾置返回类型autof[](intx)-double{returnx*1.5;};// 常见场景返回复杂类型或条件分支autog[](boolflag)-std::string{returnflag?yes:no;};4. 捕获外部变量核心用法intx10;inty20;// [] 按值捕获所有外部变量autof1[]{returnxy;};// [] 按引用捕获所有外部变量autof2[]{x100;y200;};// 可以修改外部变量f2();// 现在 x100, y200// 混合捕获值捕获 x引用捕获 yautof3[,y]{yx1;};// 混合捕获引用捕获 x值捕获 yautof4[,x]{/* y 可修改x 只读 */};// 只捕获特定变量autof5[x]{returnx;};// 值捕获 xautof6[y]{y99;};// 引用捕获 yautof7[x,y]{yx1;};// 混合混合捕获详解[, y]— 默认值捕获y 单独引用捕获intx10;inty20;intz30;// [] 默认按值捕获所有外部变量// 但 y 单独指定 y 按引用捕获autof[,y]{// x、z 是值捕获 → 只读副本不能修改// y 是引用捕获 → 可以修改原变量// int tmp x; // ✅ 可以读 x// x 100; // ❌ 编译错误x 是 const 副本yxz;// ✅ 可以修改 y引用捕获// z 50; // ❌ 编译错误z 是 const 副本};f();// 执行后x10, y40被修改了, z30记忆规则[, y] “默认全值y 特殊照顾按引用”[, x]— 默认引用捕获x 单独值捕获intx10;inty20;intz30;// [] 默认按引用捕获所有外部变量// 但 x 单独指定按值捕获autof[,x]{// y、z 是引用捕获 → 可读可写// x 是值捕获 → 只读副本y100;// ✅ 可以修改 y引用捕获z200;// ✅ 可以修改 z引用捕获// int tmp x; // ✅ 可以读 x// x 50; // ❌ 编译错误x 是 const 副本};f();// 执行后x10没变, y100, z200记忆规则[, x] “默认全引用x 特殊照顾按值”5.mutable关键字修改值捕获的副本默认情况下值捕获的变量在 lambda 内是const的intx10;// 错误不能修改值捕获的副本// auto f [x] { x; }; // 编译失败// 正确加 mutable 允许修改副本不影响原变量autof[x]()mutable{x;// 修改的是副本returnx;};f();// 返回 11f();// 返回 12副本被保留了std::coutx;// 原变量仍是 106. 初始化捕获C14在捕获列表里直接初始化autof1[x10]{returnx;};// 捕获时初始化autof2[xstd::move(ptr)]{/* ... */};// 移动捕获inta5;autof3[xa1]{returnx;};// 表达式初始化7. 泛型 lambdaC14参数用auto实现类似模板的效果// 泛型 lambda可接受任意类型autoadd[](autoa,autob){returnab;};add(1,2);// int intadd(1.5,2.5);// double doubleadd(std::string(a),std::string(b));// string string8. 无捕获 lambda 可转换为函数指针// 无捕获的 lambda 可以隐式转换为函数指针int(*fp)(int)[](intx){returnx*2;};std::coutfp(5);// 输出 10// 有捕获的 lambda 不能这样做inty10;// int (*fp2)(int) [y](int x) { return x y; }; // 编译失败9. 实际场景示例作为回调函数std::vectorintv{1,2,3,4,5};// std::sort 降序排序std::sort(v.begin(),v.end(),[](inta,intb){returnab;});// std::find_if 查找autoitstd::find_if(v.begin(),v.end(),[](intx){returnx3;});作为std::function存储std::functionint(int,int)f[](inta,intb){returnab;};用于延迟执行intthreshold5;autois_large[threshold](intx){returnxthreshold;};// 稍后使用for(intx:{3,7,2,9}){if(is_large(x))std::coutx ;}速查表写法含义[]不捕获任何外部变量[]按值捕获所有外部变量[]按引用捕获所有外部变量[x]只值捕获x[x]只引用捕获x[, x]值捕获所有但x按引用[, x]引用捕获所有但x按值[x, y]x按值y按引用[x expr]初始化捕获C14[...]包展开按值捕获C20[...]包展开按引用捕获C20