1. 函数对象与Lambda表达式概述
在C++编程中,函数对象(Function Object)和Lambda表达式都是实现可调用对象的重要方式。函数对象是通过重载operator()实现的类实例,而Lambda表达式则是C++11引入的一种匿名函数语法糖。
函数对象的典型实现如下:
cpp复制class Add {
public:
int operator()(int a, int b) const {
return a + b;
}
};
Add add;
int result = add(3, 5); // 调用函数对象
Lambda表达式的基本语法为:
cpp复制[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 { 函数体 }
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Lambda表达式的核心组件解析
2.1 捕获列表详解
捕获列表决定了Lambda表达式如何访问外部变量,主要有以下几种形式:
- 值捕获:[var] - 创建变量的副本
- 引用捕获:[&var] - 通过引用访问变量
- 隐式捕获:
- [=] - 隐式值捕获所有使用的变量
- [&] - 隐式引用捕获所有使用的变量
特殊捕获方式:
cpp复制[this] // 捕获当前类的this指针
[*this] // C++17起,通过值捕获当前类对象
重要提示:引用捕获可能导致悬垂引用问题,特别是在异步操作中使用Lambda时需格外小心。
2.2 参数列表与返回类型
Lambda的参数列表与普通函数类似,但C++14后支持auto参数:
cpp复制auto lambda = [](auto x, auto y) { return x + y; };
返回类型可以显式指定,也可以由编译器推导:
cpp复制[]() -> int { return 42; } // 显式指定返回类型
[](double d) { return d > 0; } // 推导返回类型为bool
3. Lambda表达式的高级特性
3.1 mutable关键字
默认情况下,值捕获的变量在Lambda内是const的,使用mutable可以
