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

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

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

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


#1楼

语言特色:

模板和通用代码

  • 类模板的模板参数推导

    • 就像函数如何推导模板参数一样,现在构造函数可以推导出类的模板参数
    • http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
  • template

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

  • templatetypename bob> struct foo {}

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

  • auto x{8}; 是一个int

  • using ...和列表进行现代化改造

LAMBDA

  • constexpr lambdas

    • 如果Lambdas符合条件,他们就会隐瞒constexpr
  • 在lambdas中捕获*this

    • [*this]{ std::cout << could << " be " << useful << '\\n'; }

属性

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

  • namespace s和enum { erator[[s]] }上的[[attributes]]

  • 在属性中using以避免重复属性命名空间。

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

    • C ++ 14的措辞允许编译器拒绝未知的范围属性。

语法清理

  • 内联变量

    • 像内联函数
    • 编译器选择实例实例化的位置
    • 弃用静态constexpr重新声明 ,现在隐式内联。
  • namespace A::B

  • 简单的static_assert(expression); 没有字符串

  • 没有throw ,除非throw()throw()noexcept(true)

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

  • 结构化绑定

    • 基本上,一流的std::tieauto
    • 例:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • 创建的变量itinserted与来自推定的类型pair那个map::insert回报。
    • 使用元组/对喜欢& std::array s和相对平坦的结构
    • 实际上在标准中命名为结构化绑定
  • if (init; condition)switch (init; condition)

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

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

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

杂项

  • 十六进制浮点文字

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

  • 保证副本省略

    • 最后!
    • 并非在所有情况下,但区分语法,你从“真正的省略”,“只是创造一些被称为elision的东西”。
  • 通过一些修改 修复(某些)表达式的评估顺序

    • 不包括函数参数,但现在禁止函数参数评估交错
    • 使一堆破碎的代码大部分工作,并使之.then在未来的工作。
  • 枚举的直接列表初始化

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

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

  • 类型系统中的“noexcept”

  • __has_include

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

  • 继承的构造函数修复了一些极端情况(有关行为更改的示例,请参阅P0136R0 )

  • 使用继承进行聚合初始化 。

  • std::launder ,type punning等

图书馆补充:

数据类型

  • std::variant

    • 我最后检查几乎总是非空的?
    • 标记的联合类型
    • {真棒|有用}
  • std::optional

    • 也许是其中之一
    • 非常有用
  • std::any

    • 保留任何东西(可复制)
  • std::string_view

    • std::string like reference-to-character-array或substring
    • 永远不要再使用string const& 。 也可以使解析速度提高5倍。
    • "hello world"sv
    • constexpr char_traits
  • std::byte off比他们可以咀嚼的多。

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

调用东西

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

  • is_invocableis_invocable_rinvoke_result

    • 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
    • 弃用result_of
    • is_invocable是“你可以用Args...调用Foo Args...并获得与R兼容的东西”,其中R=void是默认值。
    • invoke_resultstd::result_of_t但显然不那么令人困惑?

文件系统TS v1

  • [class.path]

  • [class.filesystem.error]

  • [class.file_status]

  • [class.directory_entry]

  • [class.directory_iterator][class.recursive_directory_iterator] [class.directory_iterator] [class.recursive_directory_iterator]

  • [fs.ops.funcs]

  • fstream可以用path s打开,也可以用const path::value_type*字符串打开。

新算法

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

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

穿线

  • std::shared_mutex

    • 不定时,如果你不需要它可以更有效。
  • atomic ::is_always_lockfree

  • scoped_lock

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

    • 2014年的链接文件可能已过期
    • std算法和相关机器的并行版本
  • 硬件_ * _ interference_size

(部分) 图书馆基础知识TS v1未在上文或下文中介绍

  • [func.searchers][alg.search]
    • 搜索算法和技术
  • [pmr]

    • 多态分配器,如分配器的std::function
    • 还有一些标准的内存资源 。
    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
  • std::sample ,从一个范围中抽样?

集装箱改进

  • try_emplaceinsert_or_assign

    • 在虚假移动/复制不好的某些情况下,可以提供更好的保证
  • 拼接map<>unordered_map<>set<>unordered_set<>

    • 便宜地在容器之间移动节点。
    • 便宜地合并整个容器。
  • 字符串的非const .data()

  • 非成员std::sizestd::emptystd::data

    • 比如std::begin / end
  • 容器中的最小不完全类型支持

  • 连续迭代器“概念”

  • constexpr迭代器

  • emplace系列函数现在返回对创建对象的引用 。

智能指针变化

  • unique_ptr修正和其他unique_ptr调整。
  • weak_from_this和一些固定为共享的

其他std数据类型的改进:

  • {}构造std::tuple和其他改进
  • TriviallyCopyable reference_wrapper ,可以提升性能

杂项

  • C ++ 17库基于C11而不是C99

  • 保留std[0-9]+用于未来的标准库

  • destroy(_at|_n)uninitialized_move(_n)uninitialized_value_construct(_n)uninitialized_default_construct(_n)

    • 实用程序代码已经暴露在大多数std实现中
  • 特殊的数学函数
    • 科学家可能喜欢他们
  • std::clamp()
    • std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )粗略
  • gcdlcm
  • std::uncaught_exceptions
    • 如果你只想从析构函数中安全地抛出,则是必需的
  • std::as_const
  • std::bool_constant
  • 一大堆_v模板变量
  • std::void_t
    • 在编写模板时非常有用
  • std::owner_less
    • 比如std::less ,但是对于基于内容排序的智能指针
  • std::chrono polish
  • std::conjunctionstd::disjunctionstd::negation公开
  • std::not_fn
    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
  • std内的noexcept规则
  • std :: is_contiguous_layout ,对高效散列很有用
  • std :: to_chars / std :: from_chars ,高性能,区域设置不可知的数字转换; 最后一种序列化/反序列化为人类可读格式的方法(JSON&co)
  • std :: default_order ,间接超过std::less (由于名称损坏,删除了一些编译器的ABI 。)

性状

  • 交换
  • is_aggregate
  • has_unique_object_representations

弃用

  • 一些C库 ,
  • memory_order_consume
  • result_of ,替换为invoke_result
  • shared_ptr::unique ,它不是非常线程安全的

自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 ++中删除的一些东西((大多数是?)以前弃用的东西):

删除:

  • register ,保留供将来使用的关键字
  • bool b; ++b;
  • 三合
    • 如果您仍然需要它们,它们现在是源文件编码的一部分,而不是语言的一部分
  • ios别名
  • auto_ptr,旧的 stuff, random_shuffle
  • std::function分配器

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

尚未整合到上面的论文:

  • P0505R0 (constexpr chrono )

  • P0418R2 (原子调整)

  • P0512R0 (模板参数扣除调整)

  • P0490R0 (结构化绑定调整)

  • P0513R0 (更改为std::hash

  • P0502R0 (并行异常)

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

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

  • P0510R0 (变体限制)

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

  • P0497R0 (共享ptr调整)

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

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

规格变化:

  • 异常规范和抛出表达式

进一步参考:

  • 按年分组的论文; 并非全部被接受

  • https://isocpp.org/files/papers/p0636r0.html

    • 应在此处更新为“对现有功能的修改”。

你可能感兴趣的:(c++,standards,c++-faq,c++17)