C ++ 17有哪些新特性?

C ++ 17现在function完整,所以不太可能经历大的变化。 针对C ++ 17提出了数百个提案。

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

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

语言特点:

模板和通用代码

  • 类模板的模板参数推导

  • template <auto>

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

  • template<template<class...>typename bob> struct foo {}

  • (折叠+ … +expression式)和修订

  • auto x{8}; 是一个int

  • 现代化using ...和列表

LAMBDA

  • constexpr lambdas

    • 如果符合条件,Lambda将被隐含地表示为constexpr
  • 在lambdas中捕获*this

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

属性

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

  • namespaceenum { erator[[s]] }上的[[attributes]] enum { erator[[s]] }

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

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

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

语法清理

  • 内联variables

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

  • 简单的static_assert(expression); 没有string

  • 除非throw()throw()noexcept(true) 否则不throw

清洁多回程和stream量控制

  • 结构化的绑定

    • 基本上,一stream的std::tie auto
    • 例:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • map::insert返回的pair创buildvariables并inserted推导types。
    • 适用于tuple / pair-likes& std::array和相对扁平的结构
    • 实际上在标准中命名结构化的绑定
  • if (init; condition)switch (init; condition)

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

    • 似乎主要是支持标记,或者结束与迭代器不同types的迭代器,这有助于以null结尾的循环等。
  • 如果constexpr

    • 许多要求的function可以简化几乎通用的代码。

杂项

  • hex浮点文字

  • dynamic内存分配的过度alignment的数据

  • 保证复制elision

    • 最后!
    • 不是所有情况下,但是区分从“真正的省略”到“正在创造什么”的语法。
  • 修改 了(某些)expression式的一些修改 的评估顺序

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

  • 前进进度保证(FPG)(也称为并行algorithm的 FPG)

    • 我想这是说“执行不会永远停止线程”?
  • u8'U', u8'T', u8'F', u8'8'字符文字(string已经存在)

  • types系统中的“noexcept”

  • __has_include

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

  • inheritance的构造函数修复了一些转angular情况(有关行为更改的示例,请参见P0136R0 )

  • 使用inheritance来聚合初始化 。

  • std::launder ,打字等

图书馆增加:

数据types

  • std::variant<Ts...>

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

    • 也许有一个东西
    • 可笑有用
  • std::any

    • 拥有任何东西(这是可复制的)
  • std::string_view

    • std::string像引用字符数组或子string
    • 切勿再次使用string const& 。 也可以使parsing一个bajillion倍更快。
    • "hello world"sv
    • constexpr char_traits
  • std::byteclosures比他们可以咀嚼。

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

调用东西

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

  • is_invocableis_invocable_rinvoke_result

文件系统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 s可以用path s打开,也可以用const path::value_type*串打开。

新的algorithm

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • 为了线程的目的而添加,即使你没有使用线程也是暴露的

穿线

  • std::shared_mutex

    • 不带时间,如果你不需要它可以更有效率。
  • atomic<T> ::is_always_lockfree

  • scoped_lock<Mutexes...>

    • 一次locking多个互斥std::lock时保存一些std::lock痛苦。
  • 并行性TS v1

    • 2014年的链接文件可能已经过时
    • stdalgorithm的并行版本,以及相关的机器
  • 硬件_ * _ interference_size

(部分) Library Fundamentals TS v1不在上面或下面

集装箱改进

  • try_emplaceinsert_or_assign

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

    • 廉价地在容器之间移动节点。
    • 便宜地整合整个容器。
  • 非常量.data()为string。

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

    • std::begin / end
  • 容器中最小的不完整types支持

  • 连续迭代器“概念”

  • constexpr迭代器

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

智能指针更改

  • unique_ptr<T[]>修复和其他unique_ptr调整。
  • weak_from_this和一些固定的从这个共享

其他std数据types改进:

  • {}构buildstd::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实现中暴露
  • 特殊的math函数
    • 科学家可能会喜欢他们
  • 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模板variables
  • std::void_t<T>
    • 编写模板时非常有用
  • std::owner_less<void>
    • std::less<void> ,但对于基于内容进行sorting的智能指针
  • std::chrono波兰语
  • std::conjunctionstd::disjunctionstd::negation暴露
  • std::not_fn
  • 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库 ,
  • <codecvt>
  • memory_order_consume
  • result_of ,replace为invoke_result
  • shared_ptr::unique ,它不是非常安全的

自从C ++ 14以来, Isocpp.org已经有了一个独立的更改列表; 它已被部分掠夺。

自然TS工作并行进行,所以有一些TS不太成熟,需要等待下一次迭代。 下一次迭代的目标是按照以前计划的C ++ 20,而不是一些传言所暗示的C ++ 19。 C ++ 10已经被避免了。

从这个reddit文章和这个reddit文章中获取的初始列表,通过谷歌search或从上面的isocpp.org页面添加的链接。

从SD-6functiontesting列表中掠夺更多条目。

铛的function列表和库function列表将被掠夺。 这似乎并不可靠,因为它是C ++ 1z,而不是C ++ 17。

这些幻灯片有其他一些function丢失。

虽然“什么被删除”没有被问到,这里是一些简短的列表(大多数?)以前的弃用)从C ++中删除的C + + 17:

删除:

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

有重新词汇。 我不确定这些代码是否对代码有影响,或者只是标准中的清理:

尚未纳入上述文件的论文:

  • P0505R0 (constexpr计时)

  • P0418R2 (primefaces调整)

  • P0512R0 (模板参数演绎调整)

  • P0490R0 (结构化绑定调整)

  • P0513R0 (更改为std::hash

  • P0502R0 (并行例外)

  • P0509R1 (更新exception处理限制)

  • P0012R1 (使exception规范成为types系统的一部分)

  • P0510R0 (对变体的限制)

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

  • P0497R0 (共享ptr调整)

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

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

规格更改:

  • exception规格和抛出expression式

进一步参考: