C++ lambda表达式是编译器生成的闭包对象,支持捕获外部变量,基本语法为[捕获列表](参数列表) mutable 异常说明 属性说明 -> 返回类型 {函数体},最简形式为[]{};常用捕获方式包括[]、[x]、[&x]、[=]、[&]、[=, &z]、[this];返回类型通常自动推导;广泛用于STL算法、回调、状态封装等场景。
C++ lambda表达式是一种定义匿名函数对象的简洁语法,它能在需要函数对象的地方就地创建、使用,无需单独命名或声明函数。 它不是传统意义上的“函数”,而是一个编译器自动生成的闭包类型(closure type)的对象,支持捕获外部作用域的变量,是现代C++中函数式编程和STL算法配合的核心工具之一。
一个lambda表达式的完整形式为:
[capture-list](parameter-list) mutable-specifier exception-specifier attribute-specifier -> return-type { body }其中大多数部分可省略,最简形式可以只有[]{}(空捕获、无参、无返回值、空函数体)。常用简化写法如下:
捕获列表决定lambda如何访问定义时所在作用域的变量,是lambda区别于普通函数的关键:
⚠️ 注意:捕获的变量生命周期必须长于lambda对象本身;若按引用捕获局部变量,而lambda后续被保存(如存入vector或跨线程调用),可能导致悬垂引用——这是常见错误来源。
多数情况下不必显式写返回类型:
(如[](int x) { return x * 2; } 推导为int)lambda真正价值在于“即写即用”,尤其适合以下情况:
例如,创建一个带初始偏移的加法器:
auto adder = [offset = 10](int x) { return x + offset; };这里offset = 10是C++14引入的初始化捕获,让lambda自带初始化状态,比手动写functor更轻量。