lambda表达式必须写成[捕获列表](参数列表)->返回类型{函数体}格式,括号不可省;捕获this用[this],值捕获修改需mutable;多分支或类型不一致时须显式声明返回类型。
lambda 表达式怎么写才不会编译报错
最常见错误是捕获列表用错或返回类型推导失败。C++11 起,[capture]、(params)、-> return_type 三部分缺一不可(返回类型可省略,但有歧义时必须显式写)。比如:[]() { return 42; } 合法,但 [] { return 42; } 编译失败——括号 () 不能省。
容易踩的坑:
- 捕获
this时写成[this](正确),而非[*this](C++17 才支持按值拷贝整个对象,且需类可复制) - 值捕获后修改变量:默认不可变,要加
mutable关键字,如[x]() mutable { x++; } - 引用捕获悬空:比如在函数内返回 lambda 却捕获了局部变量的引用,运行时行为未定义
什么时候必须写 -> return_type
当 lambda 函数体包含多条语句、或分支返回不同类型时,编译器无法统一推导返回类型,必须显式声明。例如:
auto f1 = []() { return 3.14; }; // OK,推导为 double
auto f2 = [](bool b) { if (b) return 1; else return 3.14; }; // ❌ 编译失败:int 和 double 不一致
auto f3 = [](bool b) -> double { if (b) return 1; else return 3.14; }; // ✅ 显式指定
注意:即使只有一条 return,若类型涉及模板推导(如返回 std::vector<t>::iterator</t>),也建议显式写,避免跨编译器差异。
立即学习“C++免费学习笔记(深入)”;