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 写法。

posted on 2026-05-20 09:50  keleman  阅读(20)  评论(0)    收藏  举报