C++ Lambda表达式
Lambda表达式
Lambda表达式是C++ 11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而无需单独命名函数,常用于简化代码、实现回调函数或配合 STL 算法使用。
基本语法结构
Lambda表达式的基本语法如下:
[捕获列表](参数列表) -> 返回类型{
// 函数体
// 可以使用捕获列表中的变量
return expression; //可选的返回语句
}
- 捕获列表(Capture List) :定义Lambda如何访问外部变量。
- 参数列表(Parameter List):与普通函数的参数列表类似。
- 返回类型(Return Type):可省略,由编译器自动推导。
- 函数体(Body):具体的实现逻辑
捕获列表(Capture List)
捕获列表决定了Lambda如何访问外部作用域的变量:
[]:不捕获任何外部变量。[=]:按值捕获所有外部变量(副本)。[&]:按引用捕获所有外部变量。[var]:按值捕获特定变量var。[&var]:按引用捕获特定变量var。- 混合捕获:例如
[=, &x]表示按值捕获所有变量,但x按引用捕获。
示例:
int a = 1, b = 2;
auto lambda = [a, &b]() {
// a 是值捕获(只读),b 是引用捕获(可修改)
b = a + b; // 合法
// a = 3; // 错误:按值捕获的变量默认不可修改(除非用 mutable)
};
参数列表与返回类型
- 参数列表:与普通函数已知,支持默认参数(C++14起)。
- 返回类型:可显式指定(
-> type),或由return语句自动推导。
示例:
// 自动推导返回类型(int)
auto add = [](int x, int y) { return x + y; };
// 显式指定返回类型(double)
auto divide = [](int x, int y) -> double {
if (y == 0) return 0.0;
return static_cast<double>(x) / y;
};
mutable关键字
默认情况下,按值捕获的变量在Lambda内是只读的。若需修改副本,需使用mutable关键字:
int count = 0;
auto counter = [count]() mutable {
count++; // 修改的是 Lambda 内部的副本
return count;
};
Lambda的应用场景
(1)STL排序算法中的谓词
std::vector<int> nums = {3, 1, 4, 1, 5};
// 使用 Lambda 排序(降序)
std::sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b;
});
(2)异步回调
#include <thread>
std::thread t([&]() {
// 在后台线程中执行的操作
});
t.join();
(3)简化函数对象
auto print = [](const std::string& msg) {
std::cout << msg << std::endl;
};
print("Hello, Lambda!");
注意事项
- 生命周期问题:按引用捕获的变量可能在Lambda执行时已销毁,导致未定义行为。
- 性能:Lambda是编译器生成的匿名类对象,小规模使用性能接近普通函数。
- 泛型Lambda(C++14+):支持
auto参数:
auto generic = [](auto x, auto y) { return x + y; };

浙公网安备 33010602011771号