Modern C++ 概要
本文意在简单梳理现代 C++ 相比于传统 C++ 而言在具体开发中一些常用, 实用的特性/功能.
文中所述特性/功能主要涵盖的范围从 C++11 到 C++20, 我会标注引入标准的版本, 若没有加以备注, 则说明是在 C++11 引入的.
文中大部分示例代码基于 GCC(G++) 9.3.0 -std=c++2a 演示, 部分使用 MSVC(VC++) 演示的代码将标注.
C++ 语言的特点
语言风格
标准 C++ 的主要追求总结起来主要有两点: 一是程序运行期开销的最小化, 二是对于各类编程范式/业务场景的普遍支持. 基于这两个特点可以解释为什么 GC 机制, 动态反射机制以及标准网络库一直以来没有被纳入标准 C++ 中.标准规范
C++ 标准由 ISO C++ 标准委员会负责制定, 业界各方自行实现. 目前 C++ 按照 3 年一次的频率进行更新. 更新力度方面, 为了追求普适性从而对于具体的功能更新非常保守; 但对于各类新颖的编程范式/编程理念的吸纳是比较激进的.实现版本
对于 C++ 标准的实现主要在于对编译器的实现. 截至目前, C++ 最为主流的三个实现版本分别是 : GNU GCC(G++), Microsoft MSVC(VC++) 以及 Apple Clang(C++). 此外, Intel/IBM/Oracle/Nvidia 等公司/组织也有自己实现的版本. 需要注意的是, 各方对标准 C++ 规定特性的支持程度不尽相同.使用场景
与 Java, Golang, C# 等定位明确的高级语言不同, C++ 不拘泥于某种特定的业务场景. 这种特点一方面促使它几乎可以在任何场景下都提供可行的解决方案, 另一方面也导致它往往不是最佳的解决方案.
传统 C++ 与现代 C++
截至目前, C++ 标准委员会一共发布了 7 个正式版本, 分别是 : C++98, C++03, C++11, C++14, C++17, C++20 和 C++23. 这其中有三个版本最为重要 :
- C++98 : C++ 标准委员会制定的第一套 C++ 标准, C++98/03 通常被视作传统 C++. 此版本已经有了标准核心库与标准模板库.
- C++11 : 通常被视作现代 C++ 的开端. 该版本加入了标准线程库, 标准正则库, lambda 表达式以及大量新语法/功能.
- C++20 : 继 C++11 后的又一次大更新. 该版本加入了标准协程库, 模块, 强化泛型约束以及大量的新功能.
C++ 正式标的迭代准遵循着以下两个特点 :
- 每个 “大版本” 的后继下一个版本重点在于 bugfix, 如 C++03 之于 C++98, C++14 之于 C++11, C++23 之于 C++20.
- 自 C++14 起, 标准委员会将以每三年一次的频率迭代更新正式版本, 不再等待模块彻底成熟后再发布.
你可能还听说过 C++09 C++10 等上文没提到的版本, 这是因为在标准版本迭代的期间, 各个实现版本也在自主更新. 有时候这些实现版本的新内容也会成为新标准制定时的提案.
目录
- 编译期强化
- 运行期强化
- OOP 面向对象编程的强化 : 类的构造与约束
- RTTI 运行时类型识别 与 RAII 内存管理
- 函数对象容器与 Lambda 表达式
- 右值引用, 移动语义与完美转发
- 原子化内存操作与内存对齐
- 标准库功能强化
- 标准模板库的更新
- 标准线程库
- 标准协程库
- 标准正则库
- 标准时间库
- 标准文件系统库
- 其他
- 新式编译流程与模块接口单元
- 结构化绑定与 Range 机制
- 原始字符串与用户自定义字面量
- 关于 C++23 及未来的标准
- 未来的标准网络库
- 未来的标准静态反射库