C ++ 17的新功能是什么?


1007

C ++ 17现在已完成功能,因此不太可能经历大的更改。针对C ++ 17提出了数百个建议。

其中哪些功能是在C ++ 17中添加到C ++的?

使用支持“ C ++ 1z”的C ++编译器时,当编译器更新到C ++ 17时,哪些功能将可用?


26
按Clang列出的功能的完整列表:核心语言
Kerrek SB

3
该博客博斯特有一个不错的摘要:bfilipek.com/2017/01/cpp17features.html
atb

13
有关从C ++ 14到C ++ 17的主要更改的列表,请参见C ++ 14和C ++ 17 DIS之间的正式更改(P0636r0)文档。
jotik

1
@RaghavNavada太好了!是否维护了C ++ 20部分?有#53,但它的封闭...
LF

此网站en.cppreference.com/w/cpp中的所有内容均标记有所需的版本。
jw_

Answers:


1266

语言特点:

模板和通用代码

拉姆达

属性

语法清理

更清洁的多回路和流量控制

  • 结构化绑定

    • 基本上,一流std::tieauto
    • 例:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • 创建变量itinserted从与推导的类型pairmap::insert回报。
    • 适用于元组/成对的&std::arrays和相对平坦的结构
    • 在标准中实际命名的结构化绑定
  • if (init; condition)switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • 将扩展if(decl)decl不明智地转换为布尔的情况。
  • 泛化基于范围的for循环

    • 似乎主要是支持哨兵或与开始迭代器类型不同的结束迭代器,这有助于空终止循环等。
  • 如果constexpr

    • 要求大量功能来简化几乎通用的代码。

杂项

库添加:

资料类型

调用东西

文件系统TS v1

新算法

  • 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 ++中删除的内容的简短列表((大多数?)先前已弃用):

已移除:

有改写。我不确定这些对代码是否有影响,或者它们是否只是标准中的清理内容:

尚未纳入上述内容的论文:

  • P0505R0(constexpr计时)

  • P0418R2(原子调整)

  • P0512R0(模板参数扣除调整)

  • P0490R0(结构化绑定调整)

  • P0513R0(更改为std::hash

  • P0502R0(平行例外)

  • P0509R1(更新异常处理限制)

  • P0012R1(使异常规格成为类型系统的一部分)

  • P0510R0(型号限制)

  • P0504R0(可选/变体/任何标签)

  • P0497R0(共享的PTR调整)

  • P0508R0(结构化绑定节点句柄)

  • P0521R0(共享指针使用计数和唯一更改?)

规格变更:

进一步参考:


2
嗯,memory_order_consume似乎并未正式弃用。注意中不建议这样做。提及这一点也许很有意义(例如,在结尾加上括号)?
LF
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.