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 overstd::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网站好的。
- 应在此处更新为"对现有功能的修改"。
好啊。