当前位置: 首页 > 科技观察

解读C++即将迎来的重大更新:C++20的四大新特性

时间:2023-03-19 00:40:13 科技观察

解读C++即将到来的重大更新:C++20新特性的四大新特性。最近,C++开发者RainerGrimm正在通过一系列博文介绍C++20的新特性。目前本系列文章更新了两篇。本文为第一篇,主要介绍C++20的四大新特性(概念、作用域、协程和模块四大新特性)和核心语言(包括一些新的运算符和指示符)。C++20有很多更新,上图是C++20更新的概览。下面笔者首先介绍C++20的编译器支持,然后介绍TheBigFour(四大新特性)和核心语言中的新特性。编译器对C++20的支持适应新特性的最简单方法是试用它们。那么我们就面临这样一个问题:哪些编译器支持C++20的哪些特性?一般来说,cppreference.com/compiler_support_可以提供核心语言和库方面的答案。简单地说,新的GCC、Clang和EDG编译器为核心语言提供了最好的支持。此外,MSVC和AppleClang编译器还支持许多C++20功能。C++20核心语言特性。图书馆方面的情况类似。GCC具有最好的库支持,其次是Clang和MSVC编译器。C++20库特性。上面的截图只展示了对应表的第一部分,可以看出这些编译器的性能都不是很理想。即使您使用全新的编译器,这些编译器仍然不支持许多新功能。通常,您可以找到尝试这些新功能的方法。下面举两个例子:concept:GCC支持以前版本的concept;std::jthread:GitHub上有一个实现草案,来自NicolaiJosuttis:https://github.com/josuttis/jthread总之,问题没有那么严重。只需进行一些调整和修改,就可以尝试许多新功能。如有必要,我会提到如何进行此类修改。四个新特性概念(concept)使用模板进行泛型编程的关键思想是定义各种类型(type)可以使用的函数和类。但是,在实例化模板时经常会出现使用错误类型的问题,常常导致页面上出现晦涩难懂的错误信息。既然概念来了,这个问题就可以搁置了。概念允许你为模板编写需求,编译器可以检查这个需求。概念彻底改变了我们思考和编写通用代码的方式。原因如下:模板要求是接口的一部分;类模板中的函数重载或特化可以在概念基础上完成;可以获得更好的错误消息,因为编译器可以将模板参数要求与实际模板参数进行比较。但这还不是全部。您可以使用预定义的概念,或定义您自己的概念;auto和concepts的用法是统一的。您可以使用概念代替汽车;如果一个函数声明使用了一个概念,它会自动成为一个函数模板。由此,写函数模板变得和写函数一样简单。下面的代码片段展示了一个简单概念Integral的定义和用法:;elsereturngcd(b,a%b);}Integral该概念需要std::is_integral::value中的类型参数T。std::is_integral::value这个来自类型特征库的函数对T进行编译时整数检查。如果std::is_integral::value的计算结果为真,则没有问题。如果不正确,您将收到编译时错误。如果您好奇(您应该好奇),我的这篇文章介绍了类型特征库:https://www.modernescpp.com/index.php/tag/type-traits。gcd算法是在Euclid算法的基础上确定最大公约数(greatestcommondivisor)。我使用这个缩写的函数模板语法来定义gcd。gcd要求其参数和返回类型支持积分概念。gcd是一种既需要参数又需要返回值的函数模??板。也许当我去掉这个语法糖时,你可以看到gcd的真实本质。下面这段代码在语义上等同于gcd算法:templaterequiresIntegral()Tgcd(Ta,Tb){if(b==0)return;elsereturngcd(b,a%b);}if你还没有看到gcd的本质,我会在几周后发布一篇介绍这个概念的专门文章。范围图书馆范围图书馆是该概念的第一个客户。它支持的算法满足以下条件:可以直接对容器进行操作;指定一个没有迭代器的范围;可以松散地评估;可以组合。简而言之:范围库支持功能模式。代码可能比口头描述更清晰。以下函数显示了带有竖线符号的函数组合:#include#include#includeintmain(){std::vectorints{0,1,2,3,4,5};autoeven=[](inti){return0==i%2;};autosquare=[](inti){returni*i;};for(inti:ints|std::view::filter(even)|std::view::transform(square)){std::cout<getNext(intstart=0,intstep=1){autovalue=start;for(inti=0;;++i){co_yieldvalue;//1value+=step;}}intmain(){std::cout<。这部分很复杂,我会在后面写协程的文章中详细介绍。使用Wandbox在线编译器,我可以向您展示这个程序的输出:模块(Module)模块部分只是一个简单的介绍。模块承诺启用:更快的编译时间;隔离宏;表达代码的逻辑结构;无需使用头文件;摆脱丑陋的宏方法。