C ++ 17有哪些新特性?

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

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

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


语言特点:

模板和通用代码

  • 类模板的模板参数推导

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

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

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

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

  • auto x{8}; 是一个int

  • 现代化using ...和列表

  • LAMBDA

  • constexpr lambdas

  • 如果它们符合条件,Lambdas就会隐含地表现出来
  • 在lambdas中捕获*this

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

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

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

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

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

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

  • 内联变量

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

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

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

  • 清洁多回程和流量控制

  • 结构化绑定

  • 基本上,一流的std::tie auto
  • 例:
  • const auto [it, inserted] = map.insert( {"foo", bar} );
  • 创建的变量itinserted与来自推定的类型pair那个map::insert回报。
  • 适用于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的情况。
  • 泛化基于范围的循环

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

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

  • 十六进制浮点文字

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

  • 保证复制elision

  • 最后!
  • 并非所有情况下都是如此,但区别了“真正的省略”中的“刚创建的东西”的语法。
  • 修改了(某些)表达式的一些修改的评估顺序

  • 不包括函数参数,但函数参数评估交错现在被禁止
  • 让一堆断码的工作主要是,使.then在今后的工作中。
  • 直接列表初始化枚举

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

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

  • 类型系统中的“noexcept”

  • __has_include

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

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

  • 使用继承来聚合初始化。

  • std::launder ,类型双关等

  • 图书馆增加:

    数据类型

  • std::variant<Ts...>

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

  • 也许有某种东西
  • 可笑有用
  • std::any

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

  • std::string像引用字符数组或子字符串
  • 切勿再次使用string const& 。 也可以使解析速度快了许多倍。
  • "hello world"sv
  • constexpr char_traits
  • std::byte比他们可以咀嚼的更多。

  • 无论是整数还是字符,只是数据
  • 调用东西

  • 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<Foo(Args...), R>是“你可以用Args...调用Foo Args...并获得与R兼容的东西”,其中R=void是默认值。
  • invoke_result<Foo, Args...>std::result_of_t<Foo(Args...)>但显然不那么困惑?
  • 文件系统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*字符串打开。

  • 新算法

  • 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...>

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

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

  • (部分)Library Fundamentals 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<T[]>修复和其他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<T>
  • 编写模板时非常有用
  • std::owner_less<void>
  • std::less<void> ,但对于基于内容进行排序的智能指针
  • 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间接std::less 。 (由于名称被破坏,打破了一些编译器的ABI,被删除。)
  • 性状

  • 交换
  • is_aggregate
  • has_unique_object_representations
  • 弃用

  • 一些C库,
  • <codecvt>
  • memory_order_consume
  • result_of ,替换为invoke_result
  • shared_ptr::unique ,它不是非常安全的
  • 自C ++ 14以来,Isocpp.org已经有一个独立的更改列表; 它已被部分掠夺。

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

    从此reddit文章和此reddit文章中获取的初始列表,其中链接通过Google搜索或从上面的isocpp.org页面添加。

    从SD-6功能测试列表中掠夺更多条目。

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

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

    虽然没有提出“被删除的内容”,但这里列出了一些在C ++ 17中从C ++中删除的一些内容(大多数?)以前的废弃)

    删除:

  • register ,关键字保留供将来使用
  • bool b; ++b;
  • 三合
  • 如果你仍然需要它们,它们现在成为源文件编码的一部分,而不是语言的一部分
  • ios别名
  • auto_ptr,旧的<functional> stuff, random_shuffle
  • 分配器在std::function
  • 有重新词汇。 我不确定这些对代码是否有影响,或者它们只是标准中的清理:

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

  • P0505R0(constexpr计时)

  • P0418R2(原子微调)

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

  • P0490R0(结构化绑定调整)

  • P0513R0(更改为std::hash

  • P0502R0(并行例外)

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

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

  • P0510R0(变体限制)

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

  • P0497R0(共享ptr调整)

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

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

  • 规格更改:

  • 异常规格和抛出表达式
  • 进一步参考:

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

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

  • 应该在这里更新为“对现有功能的修改”。
  • 链接地址: http://www.djcxy.com/p/6885.html

    上一篇: What are the new features in C++17?

    下一篇: What is a lambda expression in C++11?