原文链接:https://www.modernescpp.com/index.php/c-20-an-overview/
翻译水平有限,请多指教
下一个大件事:C++20 (The Next Big Thing: C++20)
C++20 将成为继 C++11 之后的一个 C++ 大标准。正如 C++11 一样,C++20 将改变我们编写现代 C++ 的方式,对于 Ranges、Coroutines、Concepts 和 Modules 来说更是如此。让我通过本文的 C++ 历史进程来告诉你 C++ 的这一巨大变化。
原图链接:https://www.modernescpp.com/wp-content/uploads/2019/10/TimelineCpp.png
C++ 标准
C++ 到现在已经有 40 多岁了,这几年又发生了什么呢?这里着重于 C++20 作一个简要的回答。
C++98
上世纪 80 年代末,Bjarne Stroustrup 和 Margaret A. Ellis 写了一本著名的书《Annotated C++ Reference Manual》。
编写诸如此类的(译者注:原文是 These 而不是 This,头疼)书的有两个目的:第一,当时有很多独立的 C++ 实现,ARM 则对 C++ 的功能进行了定义;第二,ARM 是第一个 C++ 标准,即 C++98(ISO/IEC 14882)的基础(原文:First, there were many independent C++ implementations. ARM defined, therefore, the functionality of C++. Second, ARM was the base for the first C++ standard: C++98 (ISO/IEC 14882))。
C++98 有几个很重要的特性:模板、自带容器和算法的标准模板库、字符串以及 IO 流。
C++03
C++03(14882:2003) 对 C++98 进行了一个很小的技术修正,以至于它都没出现在我的时间轴上。社区里把 C++03 及其包含的 C++98 称为传统 C++。
TR1
2005 年发生了一件有意思的事,那就发布了是所谓的 “技术报告第一版 (TR1)” ,它向 C++11 也即现代 C++ 迈出了一大步。
TR1(TR 19768) 基于由 C++ 标准委员会创建的 boost 项目 ,有 13 个库可能会变成下一个 C++ 标准,例如正则表达式、随机数、智能指针(如 std::shared_ptr
)和哈希表,只有所谓的特殊数学函数要等到 C++17 了。
C++11
C++11 成为了下一个 C++ 标准,我们也称它为现代 C++。当然,这个称呼也包括 C++14 和 C++17。
C++11 的一些特性从根源上改变了我们使用 C++ 编程的方式。例如,C++11 不但采用了 TR1 提到的特性,还添加了移动语义、perfect fowarding、可变参数模板和 constexpr。
但这还没完,C++11 中,还有一个内存模型来作为线程的基础和 API。(原文:But this is not all. With C++11, we got a memory model as the fundamental threading base and a threading API.)假如你对这个好奇,可以看下我的这两个文章:memory model 和 multithreading。
C++14
C++14 是一个小的 C++ 标准,它添加了读写锁、广义 lambda 表达式和广义的 constexpr 方法(原文:generalized constexpr functions)。
C++17
C++17 既不算小也不算大,但它有两个突出的特性:并行 STL 和标准化文件系统。
约有 80 个 STL 里的算法可以通过所谓的执行策略来执行,意味着可以在 C++ 通过调用 std::sort(std::execute::par, vec.begin(), vec.end())
来实现对容器 vec 的并行排序。另外,还可以指定排序操作是应该以序列化(std::execution::seq
)还是向量化(std::execution::par_unseq
) 的方式进行。
跟 C++11 一样,boost 对 C++17 的影响也很大,我们采用了 boost 里面的文件系统(filesystem)和三个新的数据类型:std::optional
、std::variant
和 std::any
,这是我写的关于 C++17 的文章。
C++20
C++20 将会像 C++11 那样从根本上改变我们使用 C++ 编程的方式,特别是四大巨头:Ranges、Couroutines、Concepts 和 Modules。
半年前(译者注:这篇文章发布于 2019 年 10 月 17 日),我可能会写五大巨头,不过今年在科隆(Cologne)的标准化会议中移除了 contracts。contract 以一种精确且可检查的方式为软件组件提供了接口,我的文章 C++ Core Guidelines: A Short Detour to Contracts in C++20 可以为你提供更多细节。其实我无需留恋过去,因为还有一个璀璨且触手可及的未来。
新加入的 Ranges 库可以把算法直接扩展到容器中,也把算法和管道标志组合到了一起来应用到无限数据流中。
多亏了 Coroutines 库,异步 C++ 编程才可能成为主流。Coroutines(协程)是任务协同、事件循环、无限数据流和管线的基础。
Concepts 库将改变我们思考和编写模板的方式。它是合法模板参数的语义范畴,使你能够在系统类型中直接表达您的意图。当出现什么了问题时,你将得到一个简短的错误信息。
Modules 库将破除头文件的限制。它干了很多事(原文:They promise a lot),比如说,分离头文件和源文件对于预处理器来说已经过时了,然后我们也能更快和更容易地创建一个包。
当然这还没完,还有一些额外的更新:
- 三向比较运算符
<=>
- 字符串字面值作为模板参数
- chrono 库的扩展:calendar 和 time-zone
std::span
作为连续数组的视图- 可以用 constexpr 修饰虚函数
- 重定义的
volatile
- atomics 的扩展:
std::atomic_ref<T>
和std::atomic<std::shared_ptr<T>>
;可等待的 atomics(原文:waiting on atomics) - 新的同步机制,如信号量、门闩和屏障(原文:new synchronization mechanisms such as semaphores, latches, and barriers)
- 可用 constexpr 修饰的容器如
std::string
和std::vector
- 一个改进的线程
std::jthread
,它可以自动加入并可被停止
命名
因为现存的 C++ 标准都有非正式的名字,所以我们也应该给这个新生儿一个名字:
- 传统 C++:C++98 和 C++03
- 现代 C++:C++11、C++14 和 C++17
- <等待补充>:C++20、C++23 …
很难说这个名字该怎么取,4 月份的时候我在推特上发了这个问题出来:
How should we call C++20 and the beyond area?
C++98 – C++03: Legacy C++
C++11 – C++17: Modern C++
C++20 – C++… :
Honestly, I don’t know.— Rainer Grimm (@rainer_grimm) April 28, 2019
然后评论里起码有 50 条以上的回答,下面,我在评论的前面加上了用户名:
- indifferent penguin: Postmodern
- Ricardo: next generation
- Robert Ramey: The end of days
- Daniel Oliveira: C++ Reloaded/Revolution/Exoteric
- Michele Adduci: postmodern, post-postmodern, post-post-postmodern and so on
- Thomas Rodgers: C++ Endgame
- phlo81: new C++
- Eric Niebler: co_modular C++
- Martin Moene: Simple C++
- Andrey Upadyshev: C++ 2
- Joel F: Neon Genesis C++
- Breno G: C+=2
- Rasmus ‘Elg’ Bons: Futuristic C++
- Sebastian Rampe: new c++
- Dr James Smith: C++ Plus, C++ The Next Generation, C+++
- Richard Robinson: ++C
- Saurabh Purnaye: Ultra Modern cpp
- Alican Gültekin: C+++
- Alfonso Guerra: Neo-Futuris
- Improv: now C++
- Chris Blume: Moderner C++
- Satay Das: New modern C++
- JustXtofl: post-20
- Adem Budak: Postconceptual C++
你看,趋势明显就是 postmodern。当然,你或许还有更好的想法?
接下来
现在,有几个问题困扰着我。过去几年我围绕 C++20 这个话题写了 10 篇文章,我的问题是:我应该链接到我现存的这些文章,还是要重新发布一遍?前者不够完整,后者又有点多余,所以我决定走另一条路:可以的话,我将旧文章新写。理由很简单,第一,我假定你们大部分人都不知道我的已经超过一年文章;第二,我之前写完的很多特性都已经有了改变。我总体的想法是为你呈现一个完整的 C++20 的文章系列。当让,我会从四大巨头开始写。
从这开始 按钮(译者注:只能加一个链接了,按钮在这加不上)这个按钮可以引导你预览一下我现存和即将发表的 C++20 的文章。