开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
C++17 的最终特性 - 技术翻译 - 开源中国社区

C++17 的最终特性 【已翻译100%】

标签: <无>
oschina 推荐于 1年前 (共 6 段, 翻译完成于 07-18) 评论 75
收藏  
34
推荐标签: 待读

最近几周,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 line
w = v; // same effect as the previous line

get<double>(v); // ill formed
get<3>(v); // ill formed

try {
  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(邮件表)和工作组供大家加入。

txmnyzz
 翻译得不错哦!
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
评论(75)
Ctrl/CMD+Enter

C++ is DEAD!!!!
然并卵
这都什么鬼。。。
Gnu/Linux内核是否开始融入GOLANG代码!!!
dead你妹dead
呵呵,呵呵呵
真会折腾
上瘾了,这帮人
挺好的,在进步。
写了10几年C++表示,C++还是早点淘汰为好

引用来自“MarvinGuo”的评论

写了10几年C++表示,C++还是早点淘汰为好
c和c++区别大吗?C++不是C的升级版吗
咋说呢,加油吧,c/c++
C++真的是吸星大法,不过吸的越多反噬也越大
码云的 gitlab-shell 以后全部都会被移除 然后C++ 实现的组件替代

引用来自“Force武装卫队”的评论

码云的 gitlab-shell 以后全部都会被移除 然后C++ 实现的组件替代
你确定要这么干?这都够你忙活半年了

引用来自“MarvinGuo”的评论

写了10几年C++表示,C++还是早点淘汰为好

引用来自“554330833a”的评论

c和c++区别大吗?C++不是C的升级版吗
如果说c是一把水果刀,c++就是一把大号瑞士军刀 如果说c是一艘驱逐舰,c++就是一个航母编队 如果说c是湾湾,c++就是中国

引用来自“MarvinGuo”的评论

写了10几年C++表示,C++还是早点淘汰为好

引用来自“554330833a”的评论

c和c++区别大吗?C++不是C的升级版吗
1.区别大 2.不是
现在的这语法,已经看不懂了....

引用来自“Force武装卫队”的评论

码云的 gitlab-shell 以后全部都会被移除 然后C++ 实现的组件替代

引用来自“独孤青冥”的评论

你确定要这么干?这都够你忙活半年了
傻逼 不是要这么干 已经完成了好么?开会的时候不听的么?

引用来自“Force武装卫队”的评论

码云的 gitlab-shell 以后全部都会被移除 然后C++ 实现的组件替代

引用来自“独孤青冥”的评论

你确定要这么干?这都够你忙活半年了

引用来自“Force武装卫队”的评论

傻逼 不是要这么干 已经完成了好么?开会的时候不听的么?
傻逼 不是要这么干 已经完成了好么?开会的时候不听的么?
顶部