Lambda 表达式是 C++11 引入的一种匿名函数机制,它允许你在需要函数的地方快速定义一个函数对象,常用于算法回调、异步编程等场景。
1. 基本语法
cpp
复制
下载
[capture](parameters) mutable -> return_type { body }
-
[capture]
:捕获列表,指定如何捕获外部变量 -
(parameters)
:参数列表(可省略) -
mutable
:允许修改按值捕获的变量(可省略) -
-> return_type
:返回类型(可自动推导时可省略) -
{ body }
:函数体
2. 捕获列表详解
捕获方式 | 效果 |
---|---|
[] | 不捕获任何外部变量 |
[=] | 按值捕获所有外部变量(默认 const ,不可修改) |
[&] | 按引用捕获所有外部变量 |
[x] | 仅按值捕获 x |
[&x] | 仅按引用捕获 x |
[=, &x] | 默认按值捕获,但 x 按引用捕获 |
[&, x] | 默认按引用捕获,但 x 按值捕获 |
[this] | 捕获当前类的 this 指针 |
3. 核心特性
(1) 自动类型推导
cpp
复制
下载
auto lambda = [](int a, int b) { return a + b; };
(2) mutable
关键字
cpp
复制
下载
int x = 1; auto lambda = [x]() mutable { x++; // 允许修改按值捕获的副本 return x; };
(3) 立即调用(IIFE)
cpp
复制
下载
int result = [](int a, int b) { return a * b; }(3, 4); // 输出 12
4. 典型应用场景
(1) STL 算法回调
cpp
复制
下载
std::vector<int> v = {1, 2, 3}; std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; // 降序排序 });
(2) 异步编程
cpp
复制
下载
std::thread t([&]() { std::cout << "Running in thread\n"; });
(3) 延迟执行
cpp
复制
下载
auto logger = [msg = "Error!"]() { std::cerr << msg; }; if (error) logger(); // 按需调用
5. 注意事项
-
引用捕获的生命周期风险:
cpp
复制
下载
auto get_lambda() { int x = 10; return [&x]() { return x; }; // x 已被销毁! }
-
默认捕获的潜在问题:
-
[=]
可能意外捕获this
指针(C++20 后需显式捕获)
-
-
性能考虑:
-
小规模捕获优先按值
-
大规模数据考虑按引用(注意生命周期)
-
6. C++14/17/20 增强
-
C++14:支持泛型 Lambda
cpp
复制
下载
auto lambda = [](auto x) { return x * 2; };
-
C++17:
constexpr
Lambdacpp
复制
下载
constexpr auto sq = [](int x) { return x * x; }; static_assert(sq(3) == 9);
-
C++20:模板 Lambda + 捕获
[*this]
cpp
复制
下载
auto lambda = []<typename T>(T x) { /*...*/ };
示例对比
cpp
复制
下载
// 传统函数对象 struct Adder { int offset; int operator()(int x) const { return x + offset; } }; Adder add5{5}; add5(10); // 返回 15 // Lambda 等效实现 auto add5 = [offset=5](int x) { return x + offset; }; add5(10); // 返回 15
Lambda 提供了更简洁的语法来实现相同的功能。