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]] 在- namespace s和- enum { erator▼显示 } 上好的。
- 属性中的 - using 以避免重复属性命名空间。好的。
- 编译器现在需要忽略它们无法识别的非标准属性。好的。 - C++ 14的措辞允许编译器拒绝未知的范围属性。
 
语法清理
- 内联变量好的。 - 类似内联函数
- 编译器选择实例的实例化位置
- 弃用静态constexpr重新声明,现在隐式内联。
 
- namespace A::B 好的。
- 不带字符串的简单 - static_assert(expression); 。好的。
- 没有 - throw ,除非- throw() 和- throw() 是- noexcept(true) 。好的。
清洁器多回路和流量控制
- 结构化绑定好的。 - 基本上,一级std::tie 与auto 
- 例子:
- const auto [it, inserted] = map.insert( {"foo", bar} ); 
- 创建it 和inserted 变量,并从map::insert 返回的pair 中推断类型。
 
- 适用于tuple/pair-like&std::array s和相对平坦的结构
- 标准中实际命名的结构化绑定
 
- 基本上,一级
- 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_tuple 、- std::apply 适用于标的建筑好的。
- is_invocable 、- is_invocable_r 、- invoke_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_result 是- std::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] 好的。
- 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 好的。- 如果你不需要的话,它会更有效。
 
- 埃多克斯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_emplace 和- insert_or_assign 。好的。- 在某些情况下,假移动/复制会很糟糕,因此可以提供更好的保证。
 
- 用于 - map<> 、- unordered_map<> 、- set<> 和- unordered_set<> 的拼接好的。- 在容器之间便宜地移动节点。
- 便宜地合并整个容器。
 
- 字符串的非常量 - .data() 。好的。
- 非成员国 - std::size 、- std::empty 、- std::data 。好的。- 如std::begin /end 。
 
- 如
- 容器中的最小不完整类型支持好的。 
- 连续迭代器"概念"好的。 
- constexpr 迭代器好的。
- emplace 函数族现在返回对所创建对象的引用。好的。
智能指针更改
- unique_ptr 修正和其他- unique_ptr 调整。
- weak_from_this 和一些固定的
其他
- {} 建设- 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 ) ) 大致
 
- gcd 和- lcm 。
- std::uncaught_exceptions - 如果只想在不受析构函数影响的情况下抛出,则需要
 
- std::as_const 
- std::bool_constant 
- 一大堆_v 模板变量
- std::void_t - 在编写模板时非常有用
 
- std::owner_less - 和std::less 一样,但对于智能指针,它可以根据内容进行排序。
 
- 和
- std::chrono 波兰语
- std::conjunction 、- std::disjunction 、- std::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网站好的。 - 应在此处更新为"对现有功能的修改"。
 
好啊。