1. 自动推导返回类型(最大改进之一)
- C++11:
必须显式指定返回类型,如果 Lambda 内有多条返回语句,不写返回值会编译失败
语法:-> 返回类型
code:
// C++11 必须写 -> int
auto add = [](int a, int b) -> int {
if (a > 0) return a + b;
else return 0;
}; - C++14
自动推导返回类型,无需手动写 -> type
多条 return 语句、复杂逻辑都能自动推导
code:
// C++14 自动推导返回 int
auto add = [](int a, int b) {
if (a > 0) return a + b;
else return 0;
};
2. 泛型 Lambda(参数自动类型推导)
-
C++11
Lambda 参数必须写死类型,不支持泛型
code:
// C++11 只能处理 int
code:
auto print = [](int a) { std::cout << a; }; -
C++14
支持 auto 作为参数类型,实现泛型 Lambda
一个 Lambda 可以处理任意类型,等价于模板函数
// C++14 泛型 Lambda,支持 int/double/string 等所有可打印类型
code:
auto print = [](auto a) { std::cout << a; };
print(10);
print(3.14);
print("hello");
3. 初始化捕获(Init Capture)
最重要的改进,可以避免由于作用域造成的被捕获变量成为悬空变量 见more effective c++ item32
-
C++11
只支持值捕获 / 引用捕获,无法在捕获时创建新变量
无法捕获移动语义对象(如 std::unique_ptr)
code:
int x = 10;
auto f =[x]() { return x; };// 只能捕获已有变量 -
C++14
支持 初始化捕获:在捕获列表里直接创建 / 初始化变量
完美支持 移动捕获(解决 C++11 无法移动捕获的痛点)
code:
// 1. 直接创建新变量
auto f = [val = 10 ]() { return val; };
// 2. 移动捕获(核心用途!)
std::unique_ptr<int> ptr = std::make_unique<int>(20);
auto g = [p = std::move(ptr) ]() { return *p; };// C++11 做不到,unique_ptr 不能拷贝
4. 常量捕获优化(constexpr 支持)
- C++11
Lambda 不能用于编译期,无法在常量表达式中使用 - C++14
无参、无捕获的 Lambda 可以直接用于 constexpr 上下文
C++17 才正式支持 constexpr 显式声明,但 C++14 已经放宽了限制
完整对比表(速记)
表格
特性 C++11 Lambda C++14 Lambda
返回类型 必须显式声明 -> T 自动推导
参数类型 必须固定类型 支持 auto 泛型参数
捕获方式 仅值 / 引用捕获 新增初始化捕获(支持移动)
泛型支持 不支持 原生支持泛型
移动捕获 不支持 完美支持
总结
C++11:基础 Lambda,语法受限,必须手写返回值、固定参数、无法移动捕获
C++14:现代化 Lambda,自动推导返回值、泛型参数、初始化 / 移动捕获,几乎等价于匿名内联函数
日常开发中,C++14 Lambda 是完全兼容 C++11 的,且更简洁强大,优先使用 C++14 写法。
浙公网安备 33010602011771号