搜索
bottom↓
回复: 20

C++版本帝越来越看不懂了,C++17发布

[复制链接]

出0入93汤圆

发表于 2016-7-19 11:08:00 | 显示全部楼层 |阅读模式
C++17发布了。
个人表示,诸如此类语法
  1. if (auto keywords = {"if", "for", "while"};  std::any_of(keywords.begin(), keywords.end(), [&s](const char* kw) { return s == kw; })) {
  2.         variant<int, float> v, w;
  3.         v = 12;
  4.         int i = get<int>(v);
  5.         w = get<int>(v);
  6.         w = get<0>(v);                         // same effect as the previous line
  7.         w = v;                                // same effect as the previous line
  8.         auto [a , b , c] = getvalues();
  9. }
复制代码
表示看不懂了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入93汤圆

 楼主| 发表于 2016-7-19 11:11:38 | 显示全部楼层
本帖最后由 takashiki 于 2016-7-19 11:12 编辑

OSChina翻译稿在这里

C++17 的最终特性
英文原文:Final features of C++17
标签: <无>
7人收藏此文章, 我要收藏 oschina 推荐于 2周前 (共 6 段, 翻译完成于 07-18) (37评)
参与翻译(4人):昌伟兄, 无若, 可乐鸡腿, txmnyzz仅中文 | 中英文对照 | 仅英文 | 打印此文章
最近几周,C++委员会在奥卢(Oulu)召开会议,C++17的最终特性得以确定,并且它即将成为一个国际标准。在杰克逊维尔(Jacksonville)召开的最后那次会议之后,我对于C++17能给人带来大惊喜未抱太大的希望,但是奥卢会议却努力地为C++17新标准增加一些重要而且有趣的特性。Reddit页面提供了一个很好的C++17特性总览,并且,Herb Sutter在最近的CppCast站点上(还有他的行程报道) 也给出了有关C++17特性的很好的见解。另外,Michael Wong给我们呈现出了C++17特性的更加完整的概述 。
昌伟兄
昌伟兄
翻译于 2周前
0人顶
顶 翻译的不错哦!
先说重要的

正如我前面所说,在杰克逊维尔(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++的标准不会增加新内容,而是会有一些或多或少的改变。但还是希望所有的这些特性能在最终的审核中获得通过。
昌伟兄
昌伟兄
翻译于 2周前
0人顶
顶 翻译的不错哦!
C++17的最终亮点

std::variant(变体)
让我们从最让我惊讶的地方开始:变体。是的,严肃的说,C++17带来了std::variant。这太棒了,并且为将来基于变体和其他相关想法的特征铺平了道路。例如,样式匹配,C++上关于这个有一个非常好的谈话。根据David Sankel所说,std::variant是按照boost::variant和或其他variant库进行设计的。与boost::variant有非常相似的API
  1. variant<int, float> v, w;
  2. v = 12;
  3. int i = get<int>(v);
  4. w = get<int>(v);
  5. w = get<0>(v); // same effect as the previous line
  6. w = v; // same effect as the previous line

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

  9. try {
  10.   get<float>(w); // will throw.
  11. }
  12. catch (bad_variant_access&) {}
复制代码

能看到这个特征收录到了C++17标准中,而不是采用TS detour,非常高兴。
if constexpr(expression)

这是static if的C++版本(差不多)。对于我来说这是Jacksonville的亮点之一,那时,这并没有让它采用。不负众望,它通过了Oulu对于C++17的最终回顾。有了它,如果在编译过程中,一个constexpr被评估为真,C++可以轻松的让某些语句块编译:
  1. if constexpr (std::is_integer ...) { //integerstuff }
  2. else if constexpr (std::is_floating_point ...) { //floatingpointstuff }
  3. else { // NaN ;) }
复制代码

这个例子显式的说明了,constexpr必须在编译中被判断为真,但是对于static_assert没有影响。语句块中没被选定的static_assert仍然会触发。这对于标准来说是不恰当的。
还有一个有趣的地方:这个特征写为if constexpr,但是标准的拼写仍然将其命名为constexpr if,但是将它定义为了if constexpr。
可乐鸡腿
可乐鸡腿
翻译于 1周前
0人顶
顶 翻译的不错哦!
在模板中使用auto

对于C++14,匿名表达式能使用auto来定义泛型参数。 目前定义(非类型)模板参数也是可以使用auto的。这使得编写模板代码变得更加容易,因为auto要比class或typename更简短。定义可变长模板参数也可以使用auto,例如:template<auto...a>。
结构化的绑定

直至现在,仍在使用一个有名的诀窍,就是随意使用std::tie来直接分配一个元组或者一对不同的变量,而不需要手动处理结果类型。这是一个技巧,而且变量必须要存在, 现在你可以在一行中声明变量并进行初始化:
  1. auto [a , b , c] = getvalues();
复制代码

括号不能少,getvalues返回一个元组。在建议中没有提及std::pair,所以使用pair是否也能正常运行并不明确,在一些插入(insert)方法中它是由STL返回的。
昌伟兄
昌伟兄
翻译于 2周前
0人顶
顶 翻译的不错哦!
if 和 switch 与 初始化

现在 if 语句中可以定义变量了:if(int x = 42; true != false),这可以结合前面的建议。在一个 if 语句定义的变量在它的 else 部分也是是有效的。我记得现代 C++ 设计曾提示通过花括号这样一个技巧来实现这个功能,但是这仅仅是单个变量。
使用这个案例是有趣的,例如在 if 或 switch 中进行锁定,所有这些函数返回的状态码现在都可以在 if 的内部被处理。从本质上来说,这相当于写成 { var x = value; if(...){}else{}} 。
无若
无若
翻译于 2周前
0人顶
顶 翻译的不错哦!
更多

这还不是全部,比如,为了copy ellision(拷贝去除)的改进,保留了std[0-9]+的名称空间给未来的标准。还有,对于reddit的看法也有着许多有趣的讨论和观点。
C++ 17标准正逐步发展完善,标准化的工具也已成熟并且投入使用。这对C++来说是最大的收获。那些想要给下一个C++标准添砖加瓦的人,或许现在就得开始制定计划了。C++的标准化一直是由志愿者们来推动的,做这个事情没有钱拿,大家基本上都是一些日常工作和C++相关的人。建议大家去看看isocpp.org,上面有非常nice且详细的介绍,同时也有各种各样的mailing lists(邮件表)和工作组供大家加入。

出0入0汤圆

发表于 2016-7-19 11:24:24 | 显示全部楼层
看来我们要被淘汰了

出0入0汤圆

发表于 2016-7-19 11:35:17 | 显示全部楼层
让搞这些标准的人去前目的地!

出0入71汤圆

发表于 2016-7-19 12:23:05 | 显示全部楼层
靠,我决定抛弃C++了

出0入0汤圆

发表于 2016-7-19 12:45:47 | 显示全部楼层
代码可以看懂,但自己写不出来。
主要是 Lamda 表达式,variant 和 pair 用的少。

出0入0汤圆

发表于 2016-7-19 12:48:48 | 显示全部楼层
好像PYTHON啊。
呵呵。

出0入442汤圆

发表于 2016-7-19 13:17:31 来自手机 | 显示全部楼层
我从c++11开始就不再关心标准了。根本没有意义。

出0入13汤圆

发表于 2016-7-19 13:43:40 | 显示全部楼层
VS也是在找死了!VC++6.0还是很NB的!没猜对吧?

出0入0汤圆

发表于 2016-7-19 13:57:10 | 显示全部楼层
他们自己慢慢玩咯, 计算机语言现在多的是, 以后只会更多.

出0入0汤圆

发表于 2016-7-19 14:33:21 | 显示全部楼层
越整越整乱了,感觉都是一时兴起搞的。完全没用C stdio里的标准化,也是最经典的东西。

出100入101汤圆

发表于 2016-7-19 15:18:33 | 显示全部楼层
新特性应用在什么地方?看不懂

出0入0汤圆

发表于 2016-7-19 15:32:06 | 显示全部楼层
表示压力大呀,看都看不懂了

出0入93汤圆

 楼主| 发表于 2016-7-20 09:07:03 | 显示全部楼层
mangocity 发表于 2016-7-19 12:45
代码可以看懂,但自己写不出来。
主要是 Lamda 表达式,variant 和 pair 用的少。 ...

我个人认为这次升级最主要是if的扩展,都尼玛啥玩意,不过确实代码简洁了好多。其他的好像基本上就是把boost库实现的复杂语法改成了语言特性而已。当然,boost更加看不懂,这个基本上还算可以看懂但总觉得怪异。

出0入0汤圆

发表于 2016-7-20 09:18:02 | 显示全部楼层
takashiki 发表于 2016-7-20 09:07
我个人认为这次升级最主要是if的扩展,都尼玛啥玩意,不过确实代码简洁了好多。其他的好像基本上就是把bo ...

if 的语法这么一搞快要变成 for了,只少了最后一个通常用来修改循环变量的 statement。

出0入0汤圆

发表于 2016-7-20 09:57:03 | 显示全部楼层
看着像c#

出0入0汤圆

发表于 2016-7-20 09:59:49 | 显示全部楼层
还是C比较好!

出0入0汤圆

发表于 2016-7-20 10:04:48 | 显示全部楼层
takashiki 发表于 2016-7-20 09:07
我个人认为这次升级最主要是if的扩展,都尼玛啥玩意,不过确实代码简洁了好多。其他的好像基本上就是把bo ...

没有变成语言特性,C++在语言特性上的修改是非常谨慎的, 绝大部分都是用类库来扩展的。比如本文所列的variant,其实是一个库。

出0入0汤圆

发表于 2016-7-21 22:41:22 | 显示全部楼层
完全看不懂,有必要这么搞么?

出0入0汤圆

发表于 2016-8-13 00:30:27 | 显示全部楼层
确实很难

出0入0汤圆

发表于 2016-8-13 09:16:15 | 显示全部楼层
看看, 。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 07:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表