1. Lambda表达式基础概念
在C++11标准中引入的Lambda表达式,本质上是一种匿名函数的语法糖。它允许我们在需要函数对象的地方快速定义一个内联函数,而无需显式定义一个具名函数类或函数对象。Lambda表达式在现代C++编程中扮演着越来越重要的角色,特别是在STL算法、多线程编程和异步操作中。
Lambda表达式的完整语法形式如下:
cpp复制[capture-list](parameters) mutable -> return-type {
// 函数体
}
这个语法结构包含了几个关键部分:
- 捕获列表(capture-list):定义Lambda如何访问外部变量
- 参数列表(parameters):与普通函数参数列表类似
- mutable修饰符:控制能否修改按值捕获的变量
- 返回类型(return-type):可选的显式返回类型声明
- 函数体:包含实际执行的代码
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 捕获列表详解
2.1 捕获方式分类
捕获列表决定了Lambda表达式如何访问其定义作用域内的外部变量。C++提供了两种基本的捕获方式:
-
值捕获:在捕获子句中使用
=或显式列出变量名(不带&前缀)cpp复制int x = 10; auto lambda = [x] { return x * 2; }; // 值捕获x -
引用捕获:在捕获子句中使用
&或显式列出变量名(带&前缀)cpp复制int y = 20; auto lambda = [&y] { y += 5; }; // 引用捕获y
2.2 默认捕获模式
C++允许使用默认捕获模式来简化代码:
-
默认值捕获(
[=]):所有未显式列出的变量都按值捕获cpp复制int a = 1, b = 2; auto lambda = [=] { return a + b; }; // a和b都按值捕获 -
默认引用捕获(
[&]):所有未显式列出的变量都按引用捕获cpp复制int c = 3, d = 4; auto lambda = [&] { c++; d++; }; // c和d都按引用捕获
2.3 混合捕获模式
我们可以组合使用默认捕获和显式捕获,但需要注意一些规则:
cpp复制int main() {
int x = 10, y = 20, z = 30;
// 默认引用捕获,但x按值捕获
auto lambda1 = [&, x] { y++; z++; return x + y + z; };
// 默认值捕获,但y,z按引用捕获
