VS2019 v16.3首次支持C++20 Concepts

VS2019 v16.3首次支持C++20 Concepts

作者:HQ |  时间:2019-09-21 |  浏览:179 |  评论已关闭 条评论

好消息
近日,VS官方团队宣布:VS2019 v16.3 Preview 2首次开始支持C++ 20 Concepts,涵盖了编译器及标准库的支持。
首先需要提到的是,目前主要是通过命令行选项 /std:c++latest 来支持C++中一些较新的特性,当所有C++ 20特性全部在VS产品线中(包括编译器,库,IntelliSense,构建系统及调试器)可用时,我们将可以使用新的命令行选项 /std:c++20 来全面使用这些特性。
目前,IntelliSense的支持还不可用,而且在此次科隆召开的C++标准会议上也不会涵盖对这些C++标准的实现部分。

那么,什么是C++ Concepts?
Concepts是一些断言(或者宣告),我们可以使用它们来在模板参数上表达一些通用的约束条件。
通过这些约束,我们可以正式的以文档化的方式来定义约束条件并且编译器会在模板参数上强制应用这些约束条件。这会带来另外一个好处:借助编译器提供的强制性约束,我们可以借由concept-based overloading来改善编译期时间。
在网络上,我们可以找到很多有关Concepts的介绍文档。例如,”isocpp”上就有很多关于Concepts的文章,其中包括我们喜爱的作者 Bjarne Stroustrup。

到底有那些特性被支持了?
以下是编译器对Concepts特性的支持汇总:
> P0734R0: Wording Paper, C++ extensions for Concepts
> P0857R0: Wording for “functionality gaps in constraints”
> P1084R2: Today’s return-type-requirements Are Insufficient
> P0717R1: Semantic constraint matching for concepts

另外,新增了一个库头文件来提供对标准库的支持。

废话少说,举个栗子先
以下我们看一个例子,这个例子演示了借助Concepts,我们可以编写更加简洁的代码,并且还可以缩短编译的时间。

那么,ranges呢?
对于ranges,目前开发团队还在开发中。这里所说的ranges,是一个用来处理元素范围的一个组件,这个组件和Concepts有着紧密的联系。
同时,开发团队还使用了rangev3和cmcstl2这两个参考实现来测试他们的Concepts实现的正确性,而且从中发现了很多问题。这些问题中,有一些是和Concepts的实现有关,还有一些是因启用了Concepts带来的全新的编码方式所带来的问题。开发团队修复了处于第一级别的所有问题,对于处于第二级别的问题,开发团队也修复了很大部分的问题,目前现存的问题也可以通过一些其他的workaroud方式来解决。在开发和修复问题的过程中,VS开发团队使用了他们自己的CI(Continuous Integration)系统来编译和测试他们的所有实现代码。

寻找那些使用C++ 20特性的第三方库
就像开发团队之前所实现的其他C++特性一样,Concepts特性使用了新的语法和语义分析手法。开发团队也很坦承:虽然这些分析有着很高的代码覆盖率,但是不可避免地,在人们使用新的编码方式的时候,会碰到一些问题。
如果你目前使用了一些大量使用C++ 20新特性的库,可以发邮件告诉开发团队,开发团队会将这个库添加到他们的RWC(real world code)测试中,这可以有助于进一步改善他们的编译器。

总结
C++ 都已经到20了,老古董的我,知识储备还停留在C++ 11这个层次,对于这个,我是惭愧的。朋友,还是要与时俱进啊。

标签:

评论已关闭。