














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;
};
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");
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 ptr = std::make_unique(20);
auto g = [p = std::move(ptr)]() { return *p; };
表格
特性 C++11 Lambda C++14 Lambda
返回类型 必须显式声明 -> T 自动推导
参数类型 必须固定类型 支持 auto 泛型参数
捕获方式 仅值 / 引用捕获 新增初始化捕获(支持移动)
泛型支持 不支持 原生支持泛型
移动捕获 不支持 完美支持
C++11:基础 Lambda,语法受限,必须手写返回值、固定参数、无法移动捕获
C++14:现代化 Lambda,自动推导返回值、泛型参数、初始化 / 移动捕获,几乎等价于匿名内联函数
日常开发中,C++14 Lambda 是完全兼容 C++11 的,且更简洁强大,优先使用 C++14 写法。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。