首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C+过去的这一年

本文旨在让我们回顾 C++ 2019年里的变化和发展!我们将重点关注本年度里 C++ 上发生的重大事件,标准的发展,工具的变化等等……

作者 | Bartek

译者 | 苏本如,责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下为译文:

免责声明:本文提出的观点仅代表个人立场,并不代表整个ISO C++标准委员会的意见。

01

简介

以下是本年度最让我关注的三大方面:

C++ 20即将发布。

开发工具。

C++在开发者中的稳定位置。

请继续阅读以获得对以上三大方面的全面了解。

02

重大事件时间表

下表按日期顺序列出了本年度C++发生的重大事件:

03

对C++11/14的编译器支持

为了保持完整性,笔者在这里先提醒一下:Clang(从版本3.4开始),GCC(从版本5开始)和Intel C++ Compiler(从版本15开始)已经完全支持C++ 11/14。

Visual Studio团队宣布Visual Studio 2017 15.7版完全支持C++ 17,这也意味着它对C++ 11/14的支持。现在,你可以构建复杂的代码库,如boost::hana或range v3。

既然C++ 11/14在所有主流编译器中都得到了支持,那么就不存在任何理由不使用现代C++了。

04

对C++ 17的编译器支持

C++17作为ISO/IEC 14882标准:2017 编程语言–C++发布于2019年12月。

你可以在这里下载一个免费的官方文档的最终版:N4700, 2017-10-16, PDF。

支持C++的编译器的一份完整列表可以参考这里:C++17 编译器支持。

你也可以阅读我的博客文章:C++17特性(https://www.bfilipek.com/2017/01/cpp17features.html)。

关于C++17的语言特性:

从Clang版本5.0、 GCC版本8.0、 Visual Studio版本15.7和Intel C++ Compiler版本19.0.1开始,所有编译器都支持C++17的语言特性。

标准库上还有更多的工作需要完成,特别是针对并行算法和文件系统等重要问题的工作。

对于std :: filesystem的支持,你需要GCC版本8.1(或者支持更好的版本9.1)、Clang版本3.9(或者支持更好的版本7.0)和Visual Studio 2017版本15.7。

并行算法的更新最早在Visual Studio 2017 15.7中提供,但是随着之后的更新,MSVC团队又添加了更多算法。

接下来可以使用的是Intel PSTL实现,它也被添加到GCC版本9.1中。你需要Intel线程构建块(TBB - Threading Building Block) 作为后端实现(欲知详情,请参考下面这篇文章):

在Linux和macOS上使用GCC 9.1和Intel TBB实现C++ 17 STL并行算法(作者:Paul Silisteanu) :https://solarianprogrammer.com/2019/05/09/cpp-17-stl-parallel-algorithms-gcc-intel-tbb-linux-macos/

而Clang库对并行算法的支持还需要继续等待。

另一个问题是低层转换函数的实现。

Visual Studio从版本15.7开始支持在from_chars() / to_chars()函数中支持整形参数,在版本15.8中又添加了对from_chars()的浮点支持。但是完全一致的支持直到版本16.4(对to_chars()的浮点支持)才开始可用。

到目前为止Clang和GCC版本只支持整数。原因可能是MSVC STL(标准模板库)的实现是开源的,我们可以预期一些代码将被移植到其他标准库实现中。

05

C++20

关于C++20的讨论今年占据了主导地位。在德国科隆举行的夏季ISO C++标准会议后,C++20的特性已经冻结。在稍晚时间举行的贝尔法斯特C++标准会议上,第一批国家机构的一些意见得到了解决。

总之,这意味着我们明年发布新的C++标准的道路会一马平川!

下面列出C++20的主要特性:

模块(Modules)

协程(Coroutines)

标准库开箱即用的概念(Concepts)

范围(Ranges)

constexpr支持:new/ delete,dynamic_cast,try/catch,虚拟

constexpr 向量和字符串

计时(Chrono):日历、时区支持

std::format – 详见此处C++20中的std::format

std::span

std::jthread

更重要的是,很多C++ 20的特性在流行的编译器中已经实现了。像模块(Modules)支持这种最重要的工作仍然没有完成(我们只是完成了一些实验性的Module-TS实现)。

像以往一样,完整的编译器支持列表可以在cppreference网站:C++20编译器支持页面(https://en.cppreference.com/w/cpp/compiler_support#cpp2a)上找到。但是我想在这里列举几个:

06

ISO C++标准会议

今年共计举行了三次C++标准委员会会议,分别在夏威夷的科纳、德国的科隆和北爱尔兰的贝尔法斯特举行。似乎今年的委员会更愿意留在欧洲。

这里可以找到所有的会议计划,包括:即将举行的会议和已经结束的会议(https://isocpp.org/std/meetings-and-participation/upcoming-meetings)。

下一次会议将于2020年2月在布拉格举行。

二月: 夏威夷科纳会议

在这次会议上,下列C++新特性投票后被批准纳入了C++20标准:

模块 - P1103!

协程 - N4736!

将结构化绑定扩展为更像变量申明 - P1091R3

std::polymorphic_allocator - P0339

std::midpoint和std::lerp - P0811

std::execution::unseq执行策略 - P1001

std::ssize 返回有符号数的自由函数 - P1227

查找时预先计算hash值 - P0920

并行化TS 第二版也被作为以下标准发布:

ISO/IEC TS 19570:2018编程语言 - 用于并行化的C++扩展技术规范(https://www.iso.org/standard/70588.html)。

这次会议的主要会议报告摘要可以从如下两个链接找到:

r/cpp: 2019-02 科纳ISO C++标准委员会会议报告(https://www.reddit.com/r/cpp/comments/au0c4x/201902_kona_iso_c_committee_trip_report_c20/)和科纳会议后的邮件列表(https://isocpp.org/blog/2019/03/2019-03-post-kona-mailing-available)。

其他版本的会议报告链接如下:

Herb Sutter – 会议报告:冬季ISO C++ 标准会议(科纳)

Botond Ballo - 会议报告: 2019年2月科纳C++标准会议

cor3ntin – 科纳会议报告

Timur Dumler – 会议报告:2019年2月夏威夷科纳ISO C++标准委员会会议

七月: 德国科隆会议

这次会议是C++20标准的特性冻结会议。这是最后一次投票的机会。

另外,有一个主要的特性在这次会议上从草案中淘汰了。虽然Contracts(合约)很有吸引力,但实际上,委员会未能就最后的实施要点达成一致。因此,最后的决定是最好成立一个独立的研究小组,尝试在C++ 23中纳入这一特性。

这次会议批准的一些重要特性和变化如下:

合约(Contracts)从C++20中移除,Contracts研究小组成立。

文本格式化支持:std::format("For C++{}", 20) - P0645

C++20同步库 - P1135

constexpr 内存分配 - P0784

constexpr std::vector - P1004

constexpr std::string - P0980

线程可中断 join 支持(Stop Token) - P0660

source_location - P1208

using enum - P1099

constinit关键字 - P1143

数学常量 (std::numbers::pi和 friends) - P0631

将概念(Concepts)的命名方式从PascalCase(驼峰式命名法)改为snake_case(蛇形命名法) - P1754

废弃volatile关键字 - P1152

布局兼容性和指针互易性特征 - P0466

构造函数的nodiscard 属性 - P1771

改进的iterator concept hierarchy - P1207

Move-only视图 - P1456

附加视图和range适配器 - P1035

运算符加入标准库 - P1614

类模板参数推导的扩展 - P1021

这次会议的主要议程报告摘要可以在下面两个地方找到:

r/cpp thread - cologne meeting(https://www.reddit.com/r/cpp/comments/cfk9de/201907_cologne_iso_c_committee_trip_report_the/)

post Cologne mailing(https://isocpp.org/blog/2019/08/2019-08-post-cologne-mailing-available)

会议报告:

Herb Sutter – 会议报告:夏季ISO C++ 标准会议(科隆)

Timur Dumler – 会议报告: 2019年7月德国科隆C++委员会会议,

Botond Ballo – 会议报告: 2019年7月德国科隆C++ 标准会议

Silexica – 会议报告: 2019年度德国科隆ISO C++会议

Guy Davidson – 德国之行:科隆会议报告

十一月,北爱尔兰贝尔法斯特会议:

这一次,委员会不再投票任何新的特性,他们的大部分时间花在解决国家机构针对C++ 20草案提出的意见。

主要的会议报告发布在r/cpp网站上,会后的邮件列表地址为: https://isocpp.org/blog/2019/12/2019-11-post-belfast-mailing-available

其他的会议报告有:

Herb Sutter - 会议报告:秋季ISO C++ 标准会议(贝尔法斯特)

Botond Ballo - 会议报告:2019年11月贝尔法斯特C++标准会议

Ben Craig 会议报告:贝尔法斯特的独立错误

Guy Davidson - 在我家后院召开的WG21会议: 贝尔法斯特会议报告

07

编译器最新版本及说明

下面列出编译器的最新版本和最引入注目的更新。

Visual Studio

最新版本是Visual Studio 2019版本16.4,最后一次更新发生在12月3日。

– 版本说明:https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes

今年推出了新版Visual Studio 2019!它为已经非常出色的集成开发环境(IDE)带来了许多新的特性和增强功能。

这里是最初发布时的博客文章:

Visual Studio 2019: Code faster. Work smarter. Create the future. | Visual Studio Blog(https://devblogs.microsoft.com/visualstudio/visual-studio-2019-code-faster-work-smarter-create-the-future/)。

一些重要的特性:

基于Visual Studio IntelliCode的人工智能辅助代码补全。

在C++ MSBuild和CMake项目中对 Clang 和 MSVC 的 Clang-Tidy 的支持。

AddressSanitizer支持 Windows 上使用 MSVC 编译的项目

和CMake更好的集成。

概念(Concepts)在版本16.3 中可用

对to_chars()的全面支持, 完善了C++17中的要求。

提供了一个名为C++ Build Insights的新工具集。欲知详情,请参阅C++团队博客。

另一个主要的更新来自Cppcon大会,MSVC团队在会上宣布将他们的标准模板库实现开源!详情请参见:

MSVC宣布开源其标准模板库实现 | C++ 团队博客(https://devblogs.microsoft.com/cppblog/open-sourcing-msvcs-stl/)

一些其他新闻:

AddressSanitizer (ASan)在 Windows上支持MSVC | C++ 团队博客

在Visual Studio中使用clang-tidy进行代码分析 | C++ 团队博客

Visual Studio 2019版本16.3开始支持C+20 Concepts特性 | C++团队博客

这里有一个关于C++标准(包括C++20)的一致性的文档:

Microsoft C++语言一致性清单(https://docs.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance?view=vs-2019)。

GCC

最新的稳定版本9.2,发布于8月12日,详情请参见:GCC9发布系列更新(https://www.gnu.org/software/gcc/gcc-9/)。

GCC对当前C++特性的支持(https://gcc.gnu.org/projects/cxx-status.html)

Libstdc++ 状态(https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html)

Clang

最新的稳定版本9.0,发布于2019年9月19日。详情请参见:版本发布说明

Clang对当前C++特性的支持(https://gcc.gnu.org/projects/cxx-status.html)

libc++ C++1z 状态(https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html)

Intel Compiler

最新版本19.1,发布于2019年4月2日。详情请参见:版本发布说明(https://software.intel.com/en-us/articles/intel-cpp-compiler-release-notes)

Intel C++ Compiler对C++14特性的支持(https://software.intel.com/en-us/articles/c14-features-supported-by-intel-c-compiler)

Intel C++ Compiler对C++17特性的支持(https://software.intel.com/en-us/articles/c17-features-supported-by-intel-c-compiler)

C++ Builder

最新版本为Rio 10.3 更新3,于2019年11月21日发布,详见版本发布说明。

集成开发环境(IDE)- Embarcadero C++ Builder使用了一个经过修改的Clang编译器(版本5.5)和一个Dinkumware标准模板库(STL)实现,它可以与Win32和Win64应用程序一起工作。这是一个功能全面的IDE,用于从单一C++代码库构建iOS、安卓、Windows和macOS应用程序。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200204A0416500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券