旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

C++17 的终究特征【C#.Net教程】,C++17,最终特性

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:79评论:0


导读:近来几周,C++委员会在奥卢(Oulu)召开集会,C++17的终究特性得以肯定,而且它行将成为一个国际范例。在杰克逊维尔(Jacksonville)召开的末了那次集会以后,我关于C...
近来几周,C++委员会在奥卢(Oulu)召开集会,C++17的终究特性得以肯定,而且它行将成为一个国际范例。在杰克逊维尔(Jacksonville)召开的末了那次集会以后,我关于C++17能给人带来大欣喜未抱太大的愿望,然则奥卢集会却努力地为C++17新范例增添一些重要而且风趣的特性。Reddit页面供应了一个很好的C++17特性总览,而且,Herb Sutter在近来的CppCast站点上(另有他的路程报导) 也给出了有关C++17特性的很好的意见。别的,Michael Wong给我们显现出了C++17特性的越发完全的概述 。


先说重要的


正如我前面所说,在杰克逊维尔(Jacksonville)召开的那次集会以后,C++17的很多特性已异常明白。关于是不是转向C++17,我写了一篇包含三个部份的博客系列文章,提出了一些发起。我们将进入C++的新世纪,和壮大的技术范例一同宣布的另有相干的范例,这些都将成为下一代C++范例的组成部份。这意味着,那些非C++17的特性(比方,Concepts或Modules头脑)将在行将宣布的编译器中作为插件运用。Visual Studio如今供应了modules,而GCC倒是第一个支撑concept的编译器。Clang也支撑modules,而且Visual Studio和Clang不久都邑完成基于module TS的范例。


而且,我在想,接下来的两次集会将重要处置惩罚一些批评、反应和各个国家整体(又称ISO成员代表团)所提出的题目。C++的范例不会增添新内容,而是会有一些或多或少的转变。但照样愿望一切的这些特性能在终究的考核中取得经由过程。


C++17的终究亮点


std::variant(变体)


让我们从最使我惊奇的处所最先:变体。是的,庄重的说,C++17带来了std::variant。这太棒了,而且为将来基于变体和其他相干主意的特性铺平了途径。比方,款式婚配,C++上关于这个有一个异常好的说话。依据David Sankel所说,std::variant是根据boost::variant和或其他variant库举行设想的。与boost::variant有异常类似的API


variant<int, float> v, w;
v = 12;int i = get<int>(v);
w = get<int>(v);
w = get<0>(v); // same effect as the previous linew = v; // same effect as the previous lineget<double>(v); // ill formedget<3>(v); // ill formedtry {
  get<float>(w); // will throw.}catch (bad_variant_access&) {}

能看到这个特性收录到了C++17范例中,而不是采纳TS detour,异常高兴。

if constexpr(expression)

这是static if的C++版本(差不多)。关于我来讲这是Jacksonville的亮点之一,当时,这并没有让它采纳。不负众望,它经由过程了Oulu关于C++17的终究回忆。有了它,如果在编译过程当中,一个constexpr被评价为真,C++能够轻松的让某些语句块编译:

if constexpr (std::is_integer ...) 
{ //integerstuff }
else if constexpr (std::is_floating_point ...) 
{ //floatingpointstuff }
else { // NaN ;) }


这个例子显式的说清楚明了,constexpr必需在编译中被推断为真,然则关于static_assert没有影响。语句块中没被选定的static_assert依然会触发。这关于范例来讲是不适当的。


另有一个风趣的处所:这个特性写为if constexpr,然则范例的拼写依然将其命名为constexpr if,然则将它定义为了if constexpr。


在模板中运用auto


关于C++14,匿名表达式能运用auto来定义泛型参数。 如今定义(非范例)模板参数也是能够运用auto的。这使得编写模板代码变得越发轻易,由于auto要比class或typename更简短。定义可变长模板参数也能够运用auto,比方:template<auto...a>。


结构化的绑定


直至如今,仍在运用一个著名的窍门,就是随便运用std::tie来直接分派一个元组也许一对差别的变量,而不需要手动处置惩罚结果范例。这是一个技能,而且变量必需要存在, 如今你能够在一行中声明变量并举行初始化:

auto [a , b , c] = getvalues();

括号不能少,getvalues返回一个元组。在发起中没有说起std::pair,所以运用pair是不是也能一般运转并不明白,在一些插进去(insert)要领中它是由STL返回的。


if 和 switch 与 初始化


如今 if 语句中能够定义变量了:if(int x = 42; true != false),这能够连系前面的发起。在一个 if 语句定义的变量在它的 else 部份也是是有用的。我记得当代 C++ 设想曾提醒经由过程花括号如许一个技能来完成这个功用,然则这仅仅是单个变量。


运用这个案例是风趣的,比方在 if 或 switch 中举行锁定,一切这些函数返回的状况码如今都能够在 if 的内部被处置惩罚。从本质上来讲,这相当于写成 { var x = value; if(...){}else{}} 。

更多

这还不是悉数,比方,为了copy ellision(拷贝去除)的革新,保留了std[0-9]+的称号空间给将来的范例。另有,关于reddit的意见也有着很多风趣的议论和看法。

C++ 17范例正逐渐生长完美,范例化的东西也已成熟而且投入运用。这对C++来讲是最大的收成。那些想要给下一个C++范例添砖加瓦的人,也许如今就得最先制订计划了。C++的范例化一直是由志愿者们来推进的,做这个事变没有钱拿,人人基本上都是一些一样平常工作和C++相干的人。发起人人去看看isocpp.org,上面有异常nice且细致的引见,同时也有林林总总的mailing lists(邮件表)和工作组供人人到场。

以上就是C++17 的终究特性的内容,更多相干内容请关注ki4网(www.ki4.cn)!

标签:C++17最终特性


欢迎 发表评论: