关于c ++:C ++ 17中有哪些新功能?

What are the new features in 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/p052r0
  • template 好的。

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

  • templatetypename bob> struct foo {}好的。

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

  • auto x{8};int。好的。

  • ...和清单使using现代化好的。

兰姆达

  • 康斯特布尔·兰姆达斯好的。

    • 如果lambda符合
  • 在兰姆达斯捕获*this。好的。

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

属性

  • [[fallthrough]][[nodiscard]][[maybe_unused]]属性好的。

  • [[attributes]]namespaces和enum { erator▼显示 }上好的。

  • 属性中的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变量,并从map::insert返回的pair中推断类型。
    • 适用于tuple/pair-like&std::arrays和相对平坦的结构
    • 标准中实际命名的结构化绑定
  • if (init; condition)switch (init; condition)。好的。

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

    • 似乎主要支持与begin迭代器类型不同的sentinel或end迭代器,这有助于处理以空结尾的循环等。
  • 如果康斯特雷普好的。

    • 为简化几乎通用的代码而大量请求的特性。

误码率

  • 十六进制浮点文本好的。

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

  • 保证副本删除好的。

    • 终于!
    • 并非所有情况下都如此,但它将您"只是创建"的语法与"真正的省略"区分开来。
  • 对(某些)表达式进行某些修改后的固定计算顺序好的。

    • 不包括函数参数,但函数参数计算交错现在被禁止
    • 使一堆损坏的代码大部分工作,并使.then在未来的工作。
  • 枚举的直接列表初始化好的。

  • 正向进度保证(fpg)(同样,并行算法的fpgs)好的。

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

  • 类型系统中的"noexcept"好的。

  • __has_include好的。

    • 测试头文件include是否为错误
    • 使从实验迁移到标准几乎无缝
  • 指针转换修复数组好的。

  • 继承的构造函数修复了某些角情况(有关行为更改的示例,请参阅p136r0)好的。

  • 具有继承的聚合初始化。好的。

  • std::launder型、双关式等好的。

库添加:数据类型

  • std::variant好的。

    • 上次检查时几乎总是不空的?
    • 标记的联合类型
    • 很棒有用
  • std::optional好的。

    • 可能拿着什么东西
    • 非常有用
  • std::any好的。

    • 包含任何内容之一(可复制)
  • std::string_view好的。

    • 对字符数组或子字符串的类似于std::string的引用
    • 再也不要吃string const&。也可以使解析Bajillion的速度更快。
    • "hello world"sv
    • 建设工程造价1〔10〕。
  • 他们吃不下的东西。好的。

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

调用素材

  • std::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并得到与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]。好的。

  • [fs.ops.funcs]好的。

  • fstreams可以用paths和const path::value_type*串打开。好的。

新算法

  • for_each_n好的。

  • reduce好的。

  • transform_reduce好的。

  • exclusive_scan好的。

  • inclusive_scan好的。

  • transform_exclusive_scan好的。

  • transform_inclusive_scan好的。

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

螺纹加工

  • std::shared_mutex好的。

    • 如果你不需要的话,它会更有效。
  • 埃多克斯1〔45〕埃多克斯1〔46〕。好的。

  • scoped_lock好的。

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

    • 2014年起的相关文件可能已过时。
    • std算法和相关机械的并行版本
  • 硬件干扰尺寸好的。

(部分)图书馆基础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<>的拼接好的。

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

  • 非成员国std::sizestd::emptystd::data。好的。

    • std::begin/end
  • 容器中的最小不完整类型支持好的。

  • 连续迭代器"概念"好的。

  • constexpr迭代器好的。

  • emplace函数族现在返回对所创建对象的引用。好的。

智能指针更改

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

其他std数据类型改进:

  • {}建设std::tuple等改进
  • 可复制的参考包装,可以提高性能

误码率

  • 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波兰语
  • std::conjunctionstd::disjunctionstd::negation暴露
  • std::not_fn
    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
  • std内不例外规则
  • std::是连续的布局,对于有效的散列很有用
  • std::to_chars/std::from_chars,high performance,locale ungnostic number conversion;finally a way to serialize/deserialize to human readable formats(json&co)
  • std::default_order,indirection over std::less.(breaks abi of some compilers due to name mangling,removed.)

特点

  • 掉期
  • ISS-聚集体
  • 具有唯一的对象表示

贬低

  • 一些C库,
  • memory_order_consume
  • result_of,改为invoke_result
  • shared_ptr::unique不是很安全

自从C++ 14以来,ISOCP.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,旧的材料,random_shuffle
  • std::function中的分配器

有一些修改。我不确定这些对代码是否有影响,或者它们只是标准中的清理:好的。尚未纳入上述文件的文件:

  • P0505R0(constexr chrono)好的。

  • p0418r2(原子调整)好的。

  • p052r0(模板参数推导调整)好的。

  • p049r0(结构化绑定调整)好的。

  • p053r0(更改为std::hash)好的。

  • p0502r0(并行异常)好的。

  • p0509r1(更新异常处理的限制)好的。

  • P0012R1(使例外规格成为类型系统的一部分)好的。

  • p0510r0(变量限制)好的。

  • p0504r0(可选/变型/任何标签)好的。

  • p0497r0(共享ptr调整)好的。

  • p508r0(结构化绑定节点句柄)好的。

  • p0521r0(共享指针使用计数和唯一更改?)好的。

规格变化:

  • 异常规范和引发表达式

进一步参考:

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

  • https://isocpp.org/files/papers/p0636r0.html网站好的。

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

好啊。