
1. C Lambda 表达式详解Lambda 表达式是 C11 引入的一种可调用对象可以像函数一样使用但无需单独定义函数。它本质上是一个匿名的函数对象即闭包允许在局部作用域内定义功能并捕获其周围作用域的变量。Lambda 极大地提高了 STL 算法、回调函数、并发编程等场景的表达力。2. Lambda 基本语法各部分说明[capture]捕获列表指定如何捕获外部变量传值、传引用等。(parameters)参数列表与普通函数相同C14 起可用auto实现泛型。- return_type返回类型可省略编译器自动推导。{}函数体。最简单的 lambda[]{}不捕获、无参数、无返回值。3. 示例1与 STL 算法配合4. 捕获列表详解捕获列表决定了 Lambda 表达式可以访问哪些外部变量以及如何访问。⚠️注意默认值捕获[]捕获的变量是只读的除非使用mutable。捕获引用时必须确保 lambda 执行时被引用的变量仍然存活否则会产生悬垂引用。5. 示例2捕获局部变量6. 延迟调用与生命周期Lambda 表达式是一个临时对象可以赋值给std::function或auto变量并可以在其捕获的变量作用域之外调用。例如⚠️但若捕获引用且原始变量已销毁调用 f 将是未定义行为会导致程序异常退出。7. 性能分析无捕获的 lambda可以隐式转换为函数指针性能与普通函数相同。捕获少量变量编译器会生成一个匿名的函数对象大小与捕获的变量之和相当但通常内联展开开销很小。使用std::function包装lambda可能带来额外的堆分配和间接调用开销除非必要否则优先使用auto存储。8. 常见陷阱与注意事项捕获引用导致的悬垂引用如下例子mutable影响值捕获的变量如果不加mutable则是只读的但如果你只是想修改副本记得加mutable。默认捕获[]可能意外拷贝大对象若只访问个别成员用显式捕获列表[, obj]更清晰和高效些。std::function与性能std::function可能带来类型擦除开销尽量使用auto存储lambda。