惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
小众软件
小众软件
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
B
Blog
量子位
B
Blog RSS Feed
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
爱范儿
爱范儿
Jina AI
Jina AI
C
Check Point Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG

博客园 - keleman

lambda 如何捕获 所在子线程ID 配置 git 到达 通过 git &&ssh 登录 gitee.com 和 github.com 整理于豆包问答,测试可以实现 由QThread::currentThread()引出的 如何在线程中安全运行任务 由豆包整理的 持有 std::unique_ptr 的 lambda → 不能放进 std::function 从豆包整理 C++ Lambda 捕获方式・安全写法速查表 整理自豆包 firefox 149 在 linux mint 21 上的 mozillia 源安装 qt GUI 如何利用q thread 和qfuturwatcher 实现 不阻塞主线程? xargs 和管道 |的区别 一加5t的volte怎么设置 做上位机软件设计 下位机软件设计 qt 将槽函数在子线程中执行的方法 以二级指针作为函数参数,并从函数中分配空间的原理 std::forward<T> ,std::move 使用场景的区别 VS2017 设置 类模板参数推导(CTAD, Class Template Argument Deduction) postEvent 和 sendEvent的区别 QObject Event( )customEvent( ) 函数区别 关于实际项目中必要的几个文件操作接口 QwaitCondition.的工作原理 【Debian】更换软件 源出现的Certificate问题解决方法 linux PS1 提示符的颜色设置 python 的几个常用的函数 知识点 设置 docker 国内的 映像加速器 docker 容器安装软件 docke 容器设置代理 docker 安装问题
C++14 Lambda 相比 C++11 的核心改进
keleman · 2026-05-20 · via 博客园 - keleman

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 ptr = std::make_unique(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 写法。