Lambda 表达式是 C++11 引入的一种匿名函数特性,它允许你在需要函数的地方内联定义函数,而无需单独命名。
auto 函数名=[捕获列表](参数列表)->返回类型{
//函数体
};
- 捕获列表 (
capture
)
定义 lambda 如何访问外部变量
[]
不捕获任何变量[=]
按值捕获所有外部变量[&]
按引用捕获所有外部变量[x, &y]
混合捕获(x 按值,y 按引用)[this]
捕获当前类的 this 指针
- 参数列表 (
parameters
)
和普通函数参数列表类似,可以省略(当没有参数时) - 返回类型 (
return_type
)
可以省略,编译器会自动推导 - 函数体
包含要执行的代码
示例
基本 lambda
auto greet = []() {
cout << "Hello, World!";
};
greet(); // 输出: Hello, World!
带参数的 lambda
auto add = [](int a, int b) {
return a + b;
};
cout << add(3, 4); // 输出: 7
捕获外部变量
int x = 10;
auto increment = [x](int n) {
return x + n;
};
cout << increment(5); // 输出: 15
修改捕获的变量
int counter = 0;
auto increment = [&counter]() {
counter++;
};
increment();
cout << counter; // 输出: 1
高级特性
可变 lambda\ (mutable)But\ C++23
允许修改按值捕获的变量:
int x = 10;
auto foo = [x]() mutable {
x += 5; // 可以修改,但只影响 lambda 内部的副本
return x;
};
foo(); // 返回 15
std::cout << x; // 输出 10(外部 x 不变)
指定返回类型
auto divide = [](int a, int b) -> double {
if(b == 0) return 0.0;
return static_cast<double>(a)/b;
};
泛型 lambda\ But\ C++14
auto generic_add = [](auto a, auto b) {
return a + b;
};
std::cout << generic_add(3, 4.5); // 输出: 7.5
立即调用的 lambda\ (IIFE)
const auto result = [](int x) {
return x * x;
}(5); // 立即调用,result = 25
The\ End