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

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

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

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

答案

语言特点:

模板和通用代码

拉姆达

属性

语法清理

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

  • 结构化绑定

    • 基本上,一流的std::tieauto
    • 例:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • 创建的变量itinserted从与推定的类型pair那个map::insert回报。
    • 适用于元组 / 成对和std::array和相对平坦的结构
    • 在标准中实际命名的结构化绑定
  • 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 ++ 中从 C ++ 17 中删除的一些东西((大多数是?)先前已弃用的东西):

已移除:

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

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

  • P0505R0 (constexpr 计时)

  • P0418R2 (原子调整)

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

  • P0490R0 (结构化绑定调整)

  • P0513R0 (更改为std::hash

  • P0502R0 (并行例外)

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

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

  • P0510R0 (型号限制)

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

  • P0497R0 (共享的 PTR 调整)

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

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

规格变更:

进一步参考: