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 算法、回调接口一起出现,是必须熟练掌握的核心写法。