C++ Lambda 表达式详解
Lambda 表达式是 C++11 及以后版本的核心语法糖,本质是「匿名的函数对象(仿函数)」。它没有函数名,但能像函数一样调用,是 C++ 中简化代码、实现就地回调和逻辑封装的最优写法之一。
一、Lambda 基础语法
Lambda 的标准完整语法格式如下,中括号 []、小括号 ()、大括号 {} 是必填核心部分,其余是可选修饰:
[捕获列表](参数列表) mutable noexcept -> 返回值类型 { 函数体 };
各部分含义说明
- 捕获列表:核心必写。指定 lambda 函数体可以访问外部作用域的哪些变量,以及以什么方式访问(值/引用)。
- 参数列表:核心必写(无参数时可省略小括号)。支持所有普通函数的参数写法(默认参数、模板参数、值传递/引用传递等)。
- mutable:可选关键字。解除「值捕获」的只读限制。
- noexcept:可选关键字。声明当前 lambda 函数体不会抛出任何异常。
- -> 返回值类型:可选。编译器会自动推导返回值类型,只要 return 语句的类型唯一,通常可省略。
- 函数体:核心必写。lambda 要执行的具体逻辑代码。
二、核心重点:捕获列表
捕获列表用来控制外部变量的访问规则,分「基础捕获」和「高级捕获」。
1. 空捕获 []
auto func = []() {
cout << "空捕获,不能访问任何外部变量" << endl;
};
func();
- 规则:lambda 内部无法访问任何外部作用域的变量,只能用 lambda 自己的参数或局部变量。
2. 值捕获 [变量名] 或 [=]
单个值捕获 [a, b]
int a = 10, b = 20;
auto func = [a, b]() {
cout << "a=" << a << ", b=" << b << endl; // 输出:10 20
// a++; 报错!值捕获的变量默认是「只读」的
};
func();
全部值捕获 [=]
int a = 10, b = 20;
string s = "hello lambda";
auto func = [=]() {
cout << a << << b << << s << endl;
};
();

