C++17 有哪些新功能?

What are the new features in C++17?

提问人: 提问时间:6/28/2016 最后编辑:Yakk - Adam Nevraumont 更新时间:11/10/2022 访问量:248265

问:

这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或交互。

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

在 C++17 中,哪些功能被添加到 C++ 中?

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

C 标准 ++-常见问题 C ++17

评论

26赞 Kerrek SB 6/28/2016
根据 Clang 的完整功能列表:核心语言
3赞 atb 2/23/2017
这篇博客博斯特有一个很好的总结:bfilipek.com/2017/01/cpp17features.html
13赞 jotik 4/3/2017
有关从 C++14 到 C++17 的主要更改列表,请参阅官方的 C++14 和 C++ DIS 之间的更改 (P0636r0) 文档。
1赞 L. F. 7/17/2019
@RaghavNavada太棒了!是否维护了 C++20 部分?有#53,但它已经关闭了......
0赞 jw_ 12/30/2019
本网站 en.cppreference.com/w/cpp 中的所有内容都标有所需的版本。

答:

1327赞 66 revs, 16 users 83%Yakk - Adam Nevraumont #1

语言特点:

模板和通用代码

Lambda

属性

语法清理

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

  • 结构化绑定

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

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

    • 似乎主要支持哨兵,或与开始迭代器类型不同的结束迭代器,这有助于处理以 null 结尾的循环等。
  • 如果 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 chrono)

  • P0418R2(原子调整)

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

  • P0490R0(结构化绑定调整)

  • P0513R0(更改为std::hash)

  • P0502R0(并行例外)

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

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

  • P0510R0(对变体的限制)

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

  • P0497R0(共享 PTR 调整)

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

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

规格更改:

更多参考资料:

评论

5赞 L. F. 7/18/2019
嗯,似乎没有被正式弃用。只是在注释中劝阻。也许提到这一点是有意义的(例如,带有尾随括号)?memory_order_consume