C++17有哪些新特性?

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

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

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

243892 次浏览

语言特点:

模板和通用代码

lambda

属性

语法清理

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

  • 结构化绑定

    • 基本上,第一类std::tieauto
    • 示例:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • 创建变量itinserted,其类型从map::insert返回的pair推导出来。
    • 适用于元组/对喜欢�和相对扁平的结构
    • 实际上在标准中命名为结构化绑定
  • #0和#1

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

    • 似乎主要支持哨兵,或与开始迭代器不同类型的结束迭代器,这有助于处理以空结尾的循环等。
  • 如果constexr

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

杂项

图书馆补充:

数据类型

调用东西

File System TS v1

新算法

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • 为线程目的添加,即使您没有使用它们线程也会暴露

线程

(部分)图书馆基础TS v1未覆盖在上面或下面

容器改进

智能指针更改

其他std数据类型改进:

杂项

特征

已弃用

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

当然,TS的工作是并行进行的,所以有些TS还不太成熟,需要等待下一次迭代。下一次迭代的目标是之前计划的20C++,而不是一些谣言暗示的C++19。C++1O已经避免了。

初始列表取自这个reddit帖子这个reddit帖子,通过谷歌搜索或从上面的isocpp.org页面添加链接。

SD-6功能测试列表中掠夺的其他条目。

clang的功能列表库功能列表是下一个被掠夺的。这似乎不可靠,因为它C++1z,而不是C++17。

这些幻灯片在其他地方缺少一些功能。

虽然没有问“删除了什么”,但这里有一个简短的列表,列出了C++17从C++中删除的一些东西((大部分?)以前已弃用):

删除:

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

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

  • P0505R0(参数时间)

  • P0418R2(原子调整)

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

  • P0490R0(结构化绑定调整)

  • P0513R0(更改为std::hash

  • P0502R0(并行异常)

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

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

  • P0510R0(变体的限制)

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

  • P0497R0(共享ptr调整)

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

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

规格变更:

进一步参考: