一、前言

C++ 作为一门历史悠久且不断演进的编程语言,在 C++11 之后进入了“现代化”的快车道。C++11 被称为 C++ 的第二次诞生,引入了 lambda 表达式、智能指针、右值引用、并发支持等革命性特性。

然而,C++ 的标准化进程并没有止步于此。C++14、C++17 和 C++20 在 C++11 的基础上不断改进,不仅增强了语言本身的表达能力,还提升了标准库的实用性和性能。尤其是 C++20,被称为 继 C++11 之后最大的一次升级,引入了 Concepts、Ranges、协程(Coroutines)等重量级特性,几乎把 C++ 推向了一个新的高度。

本文将全面梳理 C++14 到 C++20 的语言与库特性,并配合实例进行讲解,帮助开发者快速理解这些版本的演进方向与实际应用场景。


二、C++14 新特性

虽然 C++14 相比 C++11 的变化不算大,但它起到了 平滑过渡 的作用,修复了 C++11 的一些不足,同时引入了一些语法糖和小而美的改进。

1. 泛型 lambda(Generic Lambdas)

在 C++11 中,lambda 的参数必须指定具体类型;C++14 开始允许使用 auto 作为参数类型:

#include <iostream> int main() { auto lambda = [](auto x, auto y) { return x + y; }; std::cout << lambda(1, 2) << std::endl; // int std::cout << lambda(1.5, 2.3) << std::endl; // double }

👉 意义:使 lambda 更加灵活,提升泛型编程能力。


2. 返回值类型推导(Return Type Deduction)

C++14 支持函数返回值使用 auto 自动推导:

auto add(int a, int b) { return a + b; // 自动推导为 int }

👉 优点:减少模板编程时的冗余代码。


3. 二进制字面量与数字分隔符

int bin = 0b1010; // 二进制 10 int large = 1'000'000; // 使用单引号分隔,提高可读性


4. std::make_unique

C++11 中只有 make_shared,而 make_unique 直到 C++14 才被引入,避免了显式 new

auto ptr = std::make_unique<int>(42);


5. constexpr 扩展

C++14 放宽了 constexpr 的限制,允许其包含局部变量和分支语句,使其更贴近常规函数。


小结

C++14 可以看作 C++11 的语法补全和体验优化版本,为后续 C++17 和 C++20 铺路。


三、C++17 新特性

C++17 被认为是 继 C++11 之后又一次实用性的重大更新,它不仅增强了语言特性,还大幅扩展了标准库。

1. 结构化绑定(Structured Bindings)

#include <tuple> #include <iostream> std::tuple<int, double, std::string> foo() { return {1, 2.5, "hello"}; } int main() { auto [a, b, c] = foo(); std::cout << a << ", " << b << ", " << c << std::endl; }

👉 意义:让代码更简洁,替代 std::tie


2. ifswitch 初始化语句

if (auto it = map.find(key); it != map.end()) { std::cout << it->second << std::endl; }

👉 意义:缩小变量作用域,提高代码可读性。


3. 内联变量(Inline Variables)

允许在头文件中定义全局常量,而不会导致多重定义错误:

struct Config { static inline const int max_value = 100; };


4. 折叠表达式(Fold Expressions)

简化可变参数模板的展开:

template<typename... Args> auto sum(Args... args) { return (args + ...); // 一元右折叠 }


5. std::optional

用于表示可能存在也可能不存在的值:

std::optional<int> getValue(bool ok) { if (ok) return 42; return std::nullopt; }


6. std::variantstd::visit

类型安全的联合体:

std::variant<int, std::string> v = "hello"; std::visit([](auto&& arg) { std::cout << arg; }, v);


7. std::any

保存任意类型的对象:

std::any a = 42; std::cout << std::any_cast<int>(a) << std::endl;


8. 并行 STL(Parallel STL)

C++17 引入并行执行策略,加速标准库算法:

#include <execution> #include <vector> #include <algorithm> std::vector<int> v(1000000, 1); std::sort(std::execution::par, v.begin(), v.end());


小结

C++17 提升了 表达力库的实用性,很多项目开始广泛使用。


四、C++20 新特性

C++20 被认为是继 C++11 之后最大的升级,几乎可以称为 现代 C++2.0

1. Concepts(概念)

为模板参数增加约束,提升可读性和错误提示:

#include <concepts> template <typename T> requires std::integral<T> T add(T a, T b) { return a + b; }


2. Ranges(范围库)

简化对容器的处理:

#include <ranges> #include <vector> #include <iostream> int main() { std::vector<int> v = {1, 2, 3, 4, 5}; for (auto x : v | std::views::filter([](int n){ return n % 2 == 0; }) | std::views::transform([](int n){ return n * n; })) { std::cout << x << " "; // 输出 4 16 } }


3. 协程(Coroutines)

C++20 原生支持协程,让异步编程更自然:

#include <coroutine> #include <iostream> struct Task { struct promise_type { Task get_return_object() { return {}; } std::suspend_never initial_suspend() { return {}; } std::suspend_never final_suspend() noexcept { return {}; } void return_void() {} void unhandled_exception() {} }; }; Task foo() { std::cout << "Hello "; co_await std::suspend_always{}; std::cout << "World\n"; } int main() { foo(); }


4. 模块(Modules)

替代头文件的机制,改善编译速度:

// math.ixx export module math; export int add(int a, int b) { return a + b; } // main.cpp import math; #include <iostream> int main() { std::cout << add(1, 2); }


5. constexpr 扩展

C++20 几乎允许在 constexpr 中编写完整的逻辑,包括动态分配。


6. span

表示一段连续的内存:

#include <span> #include <vector> #include <iostream> void print(std::span<int> s) { for (auto v : s) std::cout << v << " "; } int main() { std::vector<int> v = {1, 2, 3}; print(v); }


7. 其他改进

  • 三路比较运算符 <=>(太空船运算符)

  • constexprstd::vectorstd::string

  • 新的 chrono 扩展(时区支持)


五、C++14/17/20 对比总结

特性类别C++14C++17C++20
Lambda泛型捕获改进更强 constexpr
模板auto 返回折叠表达式Concepts
库扩展make_uniqueoptional/variant/anyranges/span
并发-并行 STL协程
语法糖二进制字面量结构化绑定模块/太空船运算符

👉 结论:

  • C++14:小修小补,过渡版本

  • C++17:实用增强,适合大规模工程

  • C++20:革命性升级,开启现代 C++ 新篇章


六、实际应用案例

异步网络编程 为例,分别用不同版本实现:

  • C++14:需要手写回调或 future

  • C++17:结合 std::optional 和并行 STL 优化逻辑

  • C++20:直接用 协程 + ranges 实现优雅的异步数据流处理

代码示例(C++20 协程版):

#include <coroutine> #include <iostream> #include <string> struct Task { struct promise_type { Task get_return_object() { return {}; } std::suspend_never initial_suspend() { return {}; } std::suspend_never final_suspend() noexcept { return {}; } void return_void() {} void unhandled_exception() {} }; }; Task asyncFetch(std::string url) { std::cout << "Fetching: " << url << std::endl; co_await std::suspend_always{}; std::cout << "Done: " << url << std::endl; } int main() { asyncFetch("https://example.com"); }


七、总结

C++14 的语法糖,到 C++17 的大幅实用扩展,再到 C++20 的革命性升级,C++ 逐步完成了向现代语言的转变。

  • C++14:打磨细节,让 C++11 更易用。

  • C++17:增强工程实用性,引入 optional、variant、并行 STL。

  • C++20: Concepts、Ranges、Modules、Coroutines,标志着 C++ 进入新时代。

对于开发者来说:

  • 如果项目追求稳定性,C++17 足够

  • 如果项目追求新特性和高性能,C++20 值得尝试

未来的 C++23、C++26 还将继续扩展,但 C++20 已经足够成为现代 C++ 的代表性版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920237.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920237.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920237.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarvardX TinyML小笔记2(番外1:TFLite)

1 原理 tflite就是Tensorflow的轻量化模型&#xff0c;核心处理就是量化和剪枝。不过这部分目前是在Tensorflow中封装了&#xff0c;所以这里也不会去看细节&#xff0c;主要就是看看原理和使用方法。 量化Quantization&#xff0c;其实就是把原来的float32换成int8。这样一个…

向量库Qdrant vs Milvus 系统详细对比

Qdrant vs Milvus 系统详细对比 一、它们是什么&#xff08;定位&#xff09; 两者都是专门做向量相似搜索的数据库&#xff1a;支持ANN&#xff08;近似最近邻&#xff09;检索、向量结构化过滤、REST/gRPC 接口与官方SDK&#xff1b;Milvus 官方也定位为"面向GenAI、可…

适配欧拉操作系统

背景 客户指定服务器环境欧拉操作系统&#xff0c;版本&#xff1a;6.6.0-72.0.0.76.oe2403sp1.x86_64 需要把Java 应用以及各种中间件部署在欧拉操作系统上。 问题适配MySQL 1.1 编译报错 mysql-5.7.40-el7-x86_64.tar.gz版本在CentOS7环境安装正常 当前欧拉环境直接使用CentO…

学习spring Bean的生命周期

完整项目结构 ├── pom.xml └── src/├── main/│ ├── java/│ │ └── com/│ │ └── zhang/│ │ ├── bean/│ │ │ ├── Address.java│ │ │ ├── MyBeanPostProcessor.java│ │ …

elasticsearch 7.17.23 使用spring data es实现高亮分页,scroll查询分页查询

一 介绍 1.1 工程结构 1.2 启动elasticsearch服务 1.3 高亮分页 DeepSeek 代码 效果&#xff1a; 1.4 scroll分页 代码 2.效果 后台日志 1.5 完整代码 https://gitee.com/jurf-liu/es-2.17.x-demo.git

onlyoffice整合springboot+vue实现文档在线编辑保存

项目上需要用到在线word、excel文档编辑功能&#xff0c;通过游览器在线打开一个远程的word文档编辑保存&#xff0c;这里记录下整合思路。 onlyoffice简介 ONLYOFFICE 是一款开源的办公套件&#xff0c;提供了一系列在线文档编辑和协作工具&#xff0c;适用于团队和个人使用…

Linux笔记10——shell编程基础-4

补充$#——取参数个数“$n”,有值取值&#xff0c;无值取空字符&#xff0c;一般都会加引号&#xff0c;在某些情况下避免报语法错误一、read接收键盘输入[rootlocalhost ~]# cat demo.sh #!/bin/bash echo -n "请输入你的姓名&#xff1a;" read nameecho "你…

(Redis)过期删除策略

1. 背景Redis 支持为 Key 设置过期时间&#xff08;TTL&#xff09;&#xff0c;让数据在一定时间后自动失效。 例如&#xff1a;SET session:1001 "userA" EX 60 # 60 秒后过期但是问题来了&#xff1a;Key 到期后&#xff0c;Redis 什么时候、如何删除它&#xf…

nodejs 集成mongodb实现增删改查

初始化项目: npm init -y npm install mongoose -save 安装mongoose 插件 mongoose 链接数据库语法&#xff1a; mongodb://[username:password]host1[:poert1],host2[:port2]…/[databsase]?[options…] userame&#xff1a; 用户名 passwrod: 密码 host1:port1,host2:port…

音视频学习(五十八):STAP-A模式

什么是 STAP-A&#xff1f; STAP-A 是一种特殊的 RTP 封装机制&#xff0c;专为 H.264 和 H.265 这类视频编码协议设计。它的核心目的只有一个&#xff1a;将多个小的 NALU&#xff08;网络抽象层单元&#xff09;打包进一个 RTP 包中&#xff0c;以此来减少网络开销&#xff0…

管理型交换机通过VLAN划分实现不同IP跨网段通信配置方法

管理型交换机应用场景丰富&#xff0c;如果要实现不同IP跨网段通信(比如172.22.106.X和192.168.100.X实现通信)&#xff0c;通过VLAN划分是可以满足&#xff0c;下面分享基于弱三层交换机RTL9301方案核心模块SW-24G4F-301EM配置方法&#xff01; 1. 一般结合交换机的应用场景&a…

什么是高防服务器?如何进行防御?

高防服务器是指能为用户提供防御网络攻击&#xff0c;是主要针对DDOS等流量型攻击能力的服务器&#xff0c;通过部署专业的硬件设备与软件系统&#xff0c;具备高带宽、大流量清洗能力&#xff0c;能有效抵御各类恶意流量冲击&#xff0c;确保服务器稳定运行&#xff0c;保障网…

SW - 增加导出STL数据中的三角面数,增加别人逆向建模的难度

文章目录SW - 增加导出STL数据中的三角面数&#xff0c;增加别人逆向建模的难度概述笔记SW版本导出时&#xff0c;选择STL的导出选项默认导出(精细)导出粗糙自定义导出 - 将误差和角度改为最大自定义导出 - 将误差,角度,三角面数改为最大备注这几天的感想关于我不参考人家零件&…

四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例

四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例 前言 准备工作 第一部分:后端实现 - OpenAPI 解析与批量创建 API 1. 创建 OpenAPI 解析服务 2. 创建批量用例导入 API 3. 注册新 API 路由 第二部分:前端实现 - OpenAPI 导入界面 1. 更新 `api/testca…

K8S-Service资源对象

一、概述在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题&#xff0c;kubernetes提供了Service资源&…

【STM32】CubeMX(十三):RT-THREAD

本篇博客描述的是 RT-Thread STM32 CubeMX 的使用方法。本文也为大家提供了基于 STM32 使用 CubeMX 添加 RT-Thread 并创建闪烁 LED 任务 的操作流程。 便于您更好的理解。 一、RT-Thread 是什么&#xff1f; RT-Thread 是一个开源、轻量级的实时操作系统&#xff0c;适用于…

基于Ubuntu22.04系统PaddleX和PaddleClas训练推理MMAFEDB人脸表情识别数据集(详细教程)

目录 基于Ubuntu22.04系统PaddleX和PaddleClas训练推理MMAFEDB人脸表情识别数据集(详细教程) 超实用的Paddle图像分类训练推理教程&#xff0c;助力深度学习研究&#xff01; 1、环境准备(重要⭐⭐⭐) 构建虚拟环境 安装PaddlePaddle 安装PaddleX 安装PaddleClas插件 2…

Mistral AI音频大模型Voxtral解读

1. 引言 传统的语音处理系统(如OpenAI的Whisper)在ASR任务上取得了巨大成功,能将语音高精度地转换为文本。但这只是第一步。真正的“语音理解”意味着: 内容推理:不仅知道说了什么,还能理解话语背后的含义、情感和意图。 长篇摘要:能够听完一段长达数十分钟的播客或会议…

使用Docker+WordPress部署个人博客

一、通过docker compose 自动一键部署WordPress 1. 准备工作 安装 Docker 和 Docker Compose确保服务器有公网 IP&#xff08;如果需要外部访问&#xff09;域名&#xff08;可选&#xff0c;用于绑定网站&#xff09; 2. 创建 Docker Compose 配置文件 创建一个docker-compose…

http与https配置

Web 服务详解&#xff1a;HTTP 与 HTTPS 配置 一、HTTP 服务概述 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是用于在网络上传输网页数据的基础协议&#xff0c;默认使用80 端口&#xff0c;以明文形式传输数据。常见的 HTTP 服务软件…