语言特色:
模板和通用代码
LAMBDA如果Lambdas符合条件,他们就会隐瞒constexpr[*this]{ std::cout << could << " be " << useful << '\n'; }
属性
语法清理
更清洁的多回程和流量控制const auto [it, inserted] = map.insert( {"foo", bar} );
创建变量it并inserted从与推导的类型pair是map::insert返回。基本上,一流std::tie的auto
例:
适用于元组/对喜欢std::array和相对扁平的结构
实际上在标准中命名为结构化绑定if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
延伸if(decl)到decl不可转换为bool的案例。似乎主要支持哨兵,或者结束与开始迭代器类型不同的迭代器,这有助于使用以null结尾的循环等。许多要求的功能,以简化几乎通用的代码。
杂项最后!
并非在所有情况下,但区分语法,你从“真正的省略”,“只是创造一些被称为elision的东西”。不包括函数参数,但现在禁止函数参数评估交错
使一堆破碎的代码主要工作,并使.then未来的工作。
前向进度保证(FPG)(也称为并行算法的 FPG )我认为这是说“实施可能不会永远拖延线程”?测试头文件是否包含错误
使得从实验迁移到std几乎是无缝的
继承的构造函数修复了一些极端情况(有关行为更改的示例,请参阅P0136R0)
图书馆补充:
数据类型我最后检查几乎总是非空的?
标记的联合类型
{真棒|有用}也许是其中之一
非常有用保留任何东西(可复制)std::string 比如引用字符数组或子字符串
再也不要了string const&。也可以使解析速度提高5倍。
std::byte 他们可以咀嚼更多。既不是整数也不是字符,只是数据
调用东西使用一种语法调用任何可调用的(函数指针,函数,成员指针)。从标准的INVOKE概念。采用类似函数和元组,并将元组解包到调用中。
is_invocable,is_invocable_r,invoke_result弃用 result_of
is_invocable是“你可以打电话Foo给Args...并获得兼容的东西R”,R=void默认情况下。
invoke_result是std::result_of_t,但显然不太混乱?for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
添加用于线程目的,即使您没有使用它们也会暴露
穿线
(部分)图书馆基础知识TS v1未在上文或下文中介绍
集装箱改进
智能指针变化
其他std数据类型改进:
杂项
性状
弃用
自C ++ 14以来,Isocpp.org有一个独立的变化列表; 它已被部分掠夺。
自然地,TS工作并行继续,因此有一些TS不够成熟,必须等待下一次迭代。下一次迭代的目标是先前计划的C ++ 20,而不是C ++ 19,正如一些谣言所暗示的那样。已避免使用C ++ 1O。
从reddit帖子和这个reddit帖子中获取的初始列表,通过谷歌搜索或从上面的isocpp.org页面添加链接。
从SD-6功能测试列表中掠夺的其他条目。
clang的功能列表和库功能列表接下来将被掠夺。这似乎不可靠,因为它是C ++ 1z,而不是C ++ 17。
这些幻灯片在其他地方缺少一些功能
虽然没有问“删除了什么”,但这里有一些简短的列表,列出了C ++ 17中从C ++中删除的一些东西((大多数是?)以前弃用的东西):
删除:
有重写。我不确定这些是否对代码有任何影响,或者它们是否只是标准中的清理:
尚未整合到上面的论文:P0512R0(模板参数扣除调整)
P0490R0(结构化绑定调整)
P0513R0(更改为std::hash)
P0509R1(更新异常处理限制)
P0012R1(使异常规范成为类型系统的一部分)
P0504R0(可选/变体/任意标签)
P0497R0(共享ptr调整)
P0508R0(结构化绑定节点句柄)
P0521R0(共享指针使用计数和唯一更改?)
规格变化:
进一步参考: