C++ lambda表达式是编译器生成的闭包对象,支持捕获外部变量,基本语法为[捕获列表](参数列表) mutable 异常说明 属性说明 -> 返回类型 {函数体},最简形式为[]{};常用捕获方式包括[]、[x]、[&x]、[=]、[&]、[=, &z]、[this];返回类型通常自动推导;广泛用于STL算法、回调、状态封装等场景。

C++ lambda表达式是一种定义匿名函数对象的简洁语法,它能在需要函数对象的地方就地创建、使用,无需单独命名或声明函数。 它不是传统意义上的“函数”,而是一个编译器自动生成的闭包类型(closure type)的对象,支持捕获外部作用域的变量,是现代C++中函数式编程和STL算法配合的核心工具之一。
lambda的基本语法结构
一个lambda表达式的完整形式为:
[capture-list](parameter-list) mutable-specifier exception-specifier attribute-specifier -> return-type { body }其中大多数部分可省略,最简形式可以只有[]{}(空捕获、无参、无返回值、空函数体)。常用简化写法如下:
- []() { /* 无捕获、无参 */ } —— 最简lambda
- [x, &y](int a) mutable { return a + x + y; } —— 捕获局部变量x(值)、y(引用),接受int参数,允许修改内部副本(mutable),有返回值
- [&](auto... args) { /* 捕获所有外部变量按引用 */ } —— C++14起支持泛型lambda和广义捕获
捕获列表(capture list)怎么用
捕获列表决定lambda如何访问定义时所在作用域的变量,是lambda区别于普通函数的关键:
立即学习“C++免费学习笔记(深入)”;
- []:不捕获任何变量
- [x, y]:以值方式拷贝x、y(进入lambda时复制一份)
- [&x, &y]:以引用方式绑定x、y(修改会影响原变量)
- [=]:默认值捕获,等价于自动把所有在lambda体内被使用的自动变量以值方式捕获
- [&]:默认引用捕获,所有被使用的自动变量都按引用捕获
- [=, &z]:默认值捕获,但z显式按引用捕获(混合捕获)
- [this]:捕获当前对象的指针(在类成员函数中访问this->成员)
⚠️ 注意:捕获的变量生命周期必须长于lambda对象本身;若按引用捕获局部变量,而lambda后续被保存(如存入vector或跨线程调用),可能导致悬垂引用——这是常见错误来源。
返回类型与自动推导
多数情况下不必显式写返回类型:
- 单条return语句且无return void,编译器自动推导(如[](int x) { return x * 2; } 推导为int)
- 多条return语句或含条件分支,需满足所有分支返回同类型,否则编译失败
- 含void表达式(如cout )或无return,返回类型为void
- 强制指定返回类型用尾置返回语法:[](int x) -> double { return x * 1.5; }
典型应用场景
lambda真正价值在于“即写即用”,尤其适合以下情况:
- 配合STL算法:如std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
- 作为回调函数:传给std::thread、std::async或GUI事件系统
- 封装短小逻辑避免命名污染:比如在循环内定义一次性的比较/转换逻辑
- 实现闭包行为:捕获并携带状态,例如计数器、配置参数等
例如,创建一个带初始偏移的加法器:
auto adder = [offset = 10](int x) { return x + offset; };int res = adder(5); // 得到15
这里offset = 10是C++14引入的初始化捕获,让lambda自带初始化状态,比手动写functor更轻量。










