C++23 将会是 C++20 后的下一个 C++ 标准。这个新标准对 C++ 进行了大幅改进,但其影响力却不如 C++98、C++11 或 C++20 那样翻天覆地。C++23 更像是 C++17 的传统延续。
为了理解 C++ 的这一进化步骤,让我们将 C++ 标准放在历史背景中来看看。 C++ 标准
C++ 已有超过 40 年的历史了。那么,在这些年里,C++ 都经历了什么变化呢?以下是一个简要的回答,一直延续到 C++23。
C++98
在 20 世纪 80 年代末,Bjarne Stroustrup 和 Margaret A. Ellis 合著了他们的著名书籍 Annotated C++ Reference Manual(注释版 C++ 参考手册,简称 ARM)。这些书有两个目的。首先,那时存在许多独立的 C++ 实现。因此,ARM 定义了 C++ 的功能。其次,ARM 是第一个 C++ 标准 C++98(ISO/IEC 14882)的基础。C++98 有几个关键特性:模板、包含容器和算法的标准模板库(STL)、字符串和 IO 流。
C++03
随着 C++03(14882:2003),C++98 得到了一项微小的技术修正,小到在我的时间线上都没有容身之地。在社区中,包括 C++98 在内的 C++03 被称为传统的 C++。
TR1
2005 年,发生了一件令人非常兴奋的事情。这一年,发布了所谓的技术报告 1(Technical Report 1,简称 TR1)。TR1 是向着 C++11,因此向着现代 C++ 的一大步。TR1(TR 19768)是基于 C++ 标准化委员会成员创立的 boost 项目。TR1 有 13 个库,这些库也成为下一个 C++ 标准的一部分。例如,库对应到正则表达式库、随机数库、智能指针如 std::shared_ptr,以及哈希表。只有所谓的特殊数学函数需要等到 C++17 才能使用。
C++11
C++11 是下一个 C++ 标准,但我们通常称之为现代 C++。现代 C++ 也包括了 C++14 和 C++17。C++11 拥有许多特性,这些特性从根本上改变了我们编写 C++ 程序的方式。例如,C++11 引入了 TR1 的组件,还有移动语义、完美转发、变长模板或 `constexpr,还有其他诸多特性。随着 C++11 的到来,我们还得到了一个内存模型作为基础的线程模型,以及一个线程 API。如果你感到好奇,这里有我关于内存模型和多线程的一些基本文章。
C++14
C++14 是一个小型的 C++ 标准。它引入了读写锁、泛化的 lambdas 和泛化的 constexpr 函数。
C++17
C++17 有两个显著的特性:并行 STL 和标准化的文件系统。大约 80 个 STL 算法可以使用所谓的执行策略进行执行。这意味着 std::sort(std::execute::par, vec.begin(), vec.end()) 对 C++ 实现的排序容器 vec 是一个并行处理的提示。此外,你还可以指定排序应按顺序执行(std::execution::seq)或向量化执行(std::execution::par_unseq)。就像 C++11 一样,boost 对 C++17 也产生了深远影响。我们从 boost 获取了文件系统以及三种新的数据类型:std::optional、std::variant 和 std::any。这里是我关于 C++17 (链接见文底)的一些文章。
C++20
C++20 的变革对我们编写 C++ 程序的方式产生了根本性的影响,其程度不亚于 C++11。特别是以下四个重要特性:Ranges(范围库),Coroutines(协程),Concepts(概念),以及 Modules(模块)。
新的 Ranges 库让我们可以直接在容器上表达算法,使用管道符组合算法,并将它们应用于无限数据流。
多亏了 Coroutines,异步编程在 C++ 中可能会成为主流。协程是协作任务、事件循环、无限数据流或管道的基础。
Concepts 将改变我们对模板的思考和编程方式。它们是有效模板参数的语义类别。它们让你能够直接在类型系统中表达你的意图。如果出了什么问题,你会收到简洁的错误信息。
Modules 将克服头文件的限制。它们带来了很多好处。例如,预处理器将变得不再需要。最终,我们还将拥有更快的构建时间,更简单的包构建方式。
关于 Ranges、Coroutines、Concepts、Modules 和 C++20 的文章可以参见链接。(链接见文底)
C++23
现在(2023年7月),C++23 已经完成,并进入了最终投票阶段。
C++23 提供了一种小巧但影响深远的核心语言特性——this 的推导。这种特性允许你,类似于 Python,在成员函数定义中明确地传递隐式传递的 this 指针。引入 this 的推导后,一些 C++ 中复杂的技术,例如 CRTP (奇异递归模板模式) 或者 Overload Pattern(过载模式),将变得轻而易举。
C++23 库还将新增很多有意思的特性。你可以直接使用 import std; 导入标准库,或者在 std::print 和 std::println 中应用 C++20 的格式字符串。此外,我们将出于性能考虑,获得如 std::flat_map 这样的扁平化关联容器,这些容器在时间和空间复杂度上做了一个平衡。std::flap_map 可取代 std::map 。std::optional 的接口将扩展为具有组合性的单子接口。新的数据类型 std::expected 已经具有可组合的接口,可以用于错误处理,存储预期值或非预期值。多亏了 std::mdspan,我们可以创建和操作多维数组。最后,std::generator 是第一个用于创建数字流的具体的协程。std::generator 是 Ranges 库的一部分,该库也将在 C++23 中得到增强。
|