协慌网

登录 贡献 社区

C ++ 17 中有哪些新功能?

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

在 C ++ 17 中,哪些特性被添加到 C ++ 中?

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

答案

Language features:

Templates and Generic Code

Lambda

Attributes

Syntax cleanup

Cleaner multi-return and flow control

  • Structured bindings

    • Basically, first-class std::tie with auto
    • Example:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Creates variables it and inserted with deduced type from the pair that map::insert returns.
    • Works with tuple/pair-likes & std::arrays and relatively flat structs
    • Actually named structured bindings in standard
  • if (init; condition) and switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Extends the if(decl) to cases where decl isn't convertible-to-bool sensibly.
  • Generalizing range-based for loops

    • Appears to be mostly support for sentinels, or end iterators that are not the same type as begin iterators, which helps with null-terminated loops and the like.
  • if constexpr

    • Much requested feature to simplify almost-generic code.

Misc

Library additions:

Data types

Invoke stuff

File System TS v1

New algorithms

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Added for threading purposes, exposed even if you aren't using them threaded

Threading

(parts of) Library Fundamentals TS v1 not covered above or below

Container Improvements

Smart pointer changes

Other std datatype improvements:

Misc

Traits

Deprecated

Isocpp.org has has an independent list of changes since C++14; it has been partly pillaged.

Naturally TS work continues in parallel, so there are some TS that are not-quite-ripe that will have to wait for the next iteration. The target for the next iteration is C++20 as previously planned, not C++19 as some rumors implied. C++1O has been avoided.

Initial list taken from this reddit post and this reddit post, with links added via googling or from the above isocpp.org page.

Additional entries pillaged from SD-6 feature-test list.

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 (共享指针使用计数和唯一更改?)

规格变化:

进一步参考: