C++17 有哪些新特性?

What are the new features in C++17?

C++17 现已功能完备,因此不太可能经历大的变化。为 C++17 提出了数百个提案。

哪些特性是在 C++17 中添加到 C++ 中的?

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

语言特点:

模板和通用代码

拉姆达

属性

语法清理

清洁器multi-return和流量控制

  • Structured bindings

  • 基本上,first-class std::tieauto

  • 例子: * const auto [it, inserted] = map.insert( {"foo", bar} ); * 创建变量 itinserted 并从 pair 推导出类型 map::insert returns.

  • 适用于 tuple/pair-likes & std::array 和相对平坦的结构

  • 在标准中实际命名为structured bindings

  • if (init; condition) and switch (init; condition)

  • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)

  • if(decl)扩展到decl不convertible-to-bool的情况。

  • Generalizing range-based for loops

    • 似乎主要支持哨兵,或与开始迭代器类型不同的结束迭代器,这有助于 null-terminated 循环等。
  • if constexpr

  • 很多人要求的功能来简化 almost-generic 代码。

杂项

库添加:

数据类型

调用东西

File System TS v1

New algorithms

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • 添加用于线程化目的,即使您没有使用它们线程化也会公开

线程

(部分)Library Fundamentals TS v1 以上或以下未涵盖

容器改进

智能指针变化

其他 std 数据类型改进:

杂项

特质

已弃用

Isocpp.org has 有一个独立的自 C++14 以来的变化列表;它已被部分掠夺。

自然TS 的工作是并行进行的,所以有一些TS 是not-quite-ripe 将不得不等待下一次迭代。下一次迭代的目标是之前计划的 C++20,而不是一些谣言暗示的 C++19。 C++1O 已被避免。

初始列表取自 this reddit post and this reddit post,通过谷歌搜索或从上面的 isocpp.org 页面添加了链接。

SD-6 feature-test 列表中掠夺的其他条目。

clang's feature list and library feature list 是下一个被掠夺的地方。这似乎不可靠,因为它是 C++1z,而不是 C++17。

these slides 其他地方缺少一些功能。

虽然没有询问“删除了什么”,但这里是一些在 C++17 中从 C++ 中删除的内容((主要是?)以前弃用的)的简短列表:

已删除:

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

以上未整合的论文:

  • P0505R0 (constexpr chrono)

  • P0418R2(原子调整)

  • P0512R0(模板参数推导调整)

  • P0490R0(结构化绑定调整)

  • P0513R0(更改为 std::hash

  • P0502R0(并行异常)

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

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

  • P0510R0(变体限制)

  • P0504R0(optional/variant/any 的标签)

  • P0497R0(共享指针调整)

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

  • P0521R0(共享指针使用次数和唯一变化?)

规格变更:

进一步参考: