lambda
学习定位:现代 C++ 核心知识。lambda 是日常开发中表达局部行为的常用工具,尤其适合标准库算法、回调、异步任务和临时排序/过滤规则。
1. 是什么
lambda 是匿名函数对象,可以在使用位置直接定义一段小逻辑。
auto is_active = [](const User& user) {
return user.active;
};基本结构:
[捕获列表](参数列表) -> 返回类型 {
函数体
}返回类型通常可以省略,由编译器推导。
2. 捕获方式
| 写法 | 含义 | 建议 |
|---|---|---|
[] | 不捕获外部变量 | 最安全,能不用捕获就不用 |
[x] | 按值捕获 x | 读取外部值,不希望被修改 |
[&x] | 按引用捕获 x | 需要修改外部对象,注意生命周期 |
[=] | 默认按值捕获用到的变量 | 小范围可用,公共代码中避免过度依赖 |
[&] | 默认按引用捕获用到的变量 | 谨慎使用,容易引入悬空引用 |
[this] | 捕获当前对象指针 | 异步场景要特别注意对象生命周期 |
3. 常见用法
配合算法
std::vector<int> values{1, 2, 3, 4, 5};
auto count = std::count_if(values.begin(), values.end(), [](int value) {
return value % 2 == 0;
});自定义排序
std::sort(users.begin(), users.end(), [](const User& a, const User& b) {
return a.score > b.score;
});捕获局部配置
int threshold = 60;
auto passed = [threshold](const User& user) {
return user.score >= threshold;
};4. 避坑点
- lambda 很短时最清楚;逻辑变长时,应提取成命名函数。
- 默认引用捕获
[&]不适合跨线程、异步回调或保存到对象中。 - 按值捕获的是捕获时的值,不会自动跟随后续变量变化。
- 需要修改按值捕获的副本时才使用
mutable。
5. 总结
lambda 的价值是让小段行为贴近使用位置。现代 C++ 中,它通常和 STL 算法、回调接口一起出现,是必须熟练掌握的核心写法。