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

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

C++17现在已经完成了功能,所以不太可能经历大的更改。针对C++17提出了数百项建议

C++ C++ 17中的哪些特征添加到C++中?
使用C++编译器支持C++“1Z”时,编译器更新到C++ 17?/p>时,哪些特征将是可用的?

语言特点:

模板和通用代码

  • 类模板的模板参数推断

    • 就像函数推导模板参数一样,现在构造函数可以推导类的模板参数
    • http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
  • 模板<汽车&gt

    • 表示任何(非类型模板参数)类型的值
  • 非类型模板参数修复

  • 模板<模板<类别…>typename-bob>结构foo{}

  • (折叠+…+表达式)和修订

  • autox{8}是一个int

  • 使用和和列表使现代化

兰姆达

  • 康斯特普兰姆达斯酒店

    • lambda如果符合条件,则隐式为constexpr
  • 在lambdas中捕获*此

    • [*this]{std::cout<<<<<<<<<'n';}

属性

  • [[fallthrough][[nodiscard]][[maybe_unused]]属性

  • namespaces和enum{erator[[s]]}

  • 在属性中使用,以避免重复属性名称空间

  • 现在要求编译器忽略它们无法识别的非标准属性

    • C++14语言允许编译器拒绝未知的作用域属性

语法清理

  • 内联变量

    • 类似内联函数
    • 编译器选择实例实例化的位置
    • 弃用静态constexpr重新声明,现在隐式内联
  • 名称空间A::B

  • 简单的静态断言(表达式)没有字符串

  • 除非throw()throw()noexcept(true),否则不能抛出throw()

清洁器多回路和流量控制

  • 结构化绑定

    • 基本上,一流的std::tieauto
    • 例如:
      • const auto[it,inserted]=map.insert({“foo”,bar})
      • 使用map::insert返回的中的推断类型创建变量itinserted
    • 使用tuple/pair like&amp标准::数组和相对平坦的结构
    • 标准中实际命名的结构化绑定
  • if(init;条件)开关(init;条件)

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

    • 似乎主要支持Sentinel或与begin迭代器类型不同的end迭代器,这有助于处理以null结尾的循环等
  • if constexpr

    • 这是一个简化几乎通用代码的功能

杂项

  • 十六进制浮点文字

  • 针对过度对齐数据的动态内存分配

  • 保证拷贝省略

    • 终于
    • 并非在所有情况下都是如此,但它区分了“只是创建了一个被称为省略的东西”和“真正的省略”的语法
  • 修正了(某些)表达式的求值顺序

    • 不包括函数参数,但现在禁止函数参数求值交错
    • 使一堆坏代码大部分工作,并使。然后在未来的工作中
  • 枚举的直接列表初始化

  • 前向进度保证(FPG)(也是并行算法的FPG)

    • 我认为这是在说“实现可能不会永远停止线程”
  • u8'U',u8'T',u8'F',u8'8'字符文字(字符串已存在)

  • 类型系统中的“noexcept”

  • \u包含

    • 测试头文件是否包含错误
    • 使从实验迁移到std几乎是无缝的
  • 指针转换修复程序数组

  • 继承的构造函数修复了某些特殊情况(有关行为更改的示例,请参见P0136R0)

  • 使用继承聚合初始化

  • std::流槽,键入双关等

图书馆增刊:

数据类型

  • std::variant<Ts.&gt

    • 我上次检查时几乎总是非空的
    • 标记的联合类型
    • {棒极了|有用}
  • std::可选

    • 也许有什么东西
    • 可笑的有用
  • std::any

    • 保存任何内容之一(可复制)
  • std::string\u视图

    • std::string类似于对字符数组或子字符串的引用
    • 切勿使用字符串常量&amp再次。还可以使解析速度加快数百万倍
    • “你好世界”sv
    • constexprchar\u traits
  • std::byte

    • 既不是整数也不是字符,只是数据

调用东西

  • std::invoke
    • 用一种语法调用任何可调用(函数指针、函数、成员指针)。从标准的调用概念
  • std::apply
    • 接受函数和元组,并将元组解压到调用中
  • std::make_from_tuplestd::apply应用于对象构造

  • 可开票可开票调用结果

    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html
    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0604r0.html
    • 不推荐的结果
    • 是否可报销<Foo(Args…),R&gt是“您可以使用Args…调用Foo并获取与R兼容的内容吗?”其中默认为R=void
    • invoke\u结果<Foo,Args…&gt是std::t的结果<Foo(Args…)&gt但显然不那么混乱

文件系统TS v1

  • [class.path]

  • [class.filesystem.error]

  • [类文件\u状态]

  • [class.directory\u entry]

  • [class.directory\u iterator][class.recursive\u directory\u iterator]

  • [fs.ops.funcs]

  • fstreams可以用paths打开,也可以用const path::value\u type*字符串打开

新算法

  • 用于每个

  • reduce

  • transform\u reduce

  • exclusive\u扫描

  • inclusive\u扫描

  • transform\u exclusive\u scan

  • transform\u inclusive\u scan

  • 添加用于线程目的,即使未使用线程,也会公开

穿线

  • std::共享互斥体

    • 不定时,如果你不需要它,它可以更有效
  • 原子<T&gt::总是没有锁吗

  • 范围锁定<互斥体…&gt

    • 在一次锁定多个互斥锁时,节省一些std::lock痛苦
  • 并行度TS v1

    • 2014年的相关文件可能已经过时
    • std算法和相关机器的并行版本
  • 硬件干扰大小

(部分)以上或以下未涵盖的图书馆基础知识TS v1

发表评论