下一个大件事:C++20 (The Next Big Thing: C++20)

原文链接: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 modelmultithreading

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::optionalstd::variantstd::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::stringstd::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 的文章。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值