C++17现在已经完成了功能,所以不太可能经历大的更改。针对C++17提出了数百项建议
C++ C++ 17中的哪些特征添加到C++中?
使用C++编译器支持C++“1Z”时,编译器更新到C++ 17?/p>时,哪些特征将是可用的?
语言特点:
模板和通用代码
-
类模板的模板参数推断
- 就像函数推导模板参数一样,现在构造函数可以推导类的模板参数
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
-
模板<;汽车>- 表示任何(非类型模板参数)类型的值
-
非类型模板参数修复
-
模板<;模板<;类别…>;typename-bob>;结构foo{} -
(折叠+…+表达式)和修订
-
autox{8}是一个int -
使用和和列表使
现代化
兰姆达
-
康斯特普兰姆达斯酒店
- lambda如果符合条件,则隐式为constexpr
-
在lambdas中捕获
*此[*this]{std::cout<;<;<;<;<;<;<;<;<;'n';}
属性
-
[[fallthrough],[[nodiscard]],[[maybe_unused]]属性 -
namespaces和enum{erator[[s]]} -
在属性中使用,以避免重复属性名称空间 -
现在要求编译器忽略它们无法识别的非标准属性
- C++14语言允许编译器拒绝未知的作用域属性
语法清理
-
内联变量
- 类似内联函数
- 编译器选择实例实例化的位置
- 弃用静态constexpr重新声明,现在隐式内联
-
名称空间A::B -
简单的
静态断言(表达式)没有字符串 -
除非
throw(),throw()是noexcept(true),否则不能抛出throw()
清洁器多回路和流量控制
-
结构化绑定
- 基本上,一流的
std::tie与auto - 例如:
const auto[it,inserted]=map.insert({“foo”,bar})- 使用
map::insert返回的对中的推断类型创建变量it和inserted
- 使用tuple/pair like&标准::数组和相对平坦的结构
- 标准中实际命名的结构化绑定
- 基本上,一流的
-
if(init;条件)和开关(init;条件)if(const auto[it,inserted]=map.insert({“foo”,bar});inserted)- 将
if(decl)扩展到decl不能合理转换为bool的情况
-
基于范围的循环泛化
- 似乎主要支持Sentinel或与begin迭代器类型不同的end迭代器,这有助于处理以null结尾的循环等
-
if constexpr
- 这是一个简化几乎通用代码的功能
杂项
-
十六进制浮点文字
-
针对过度对齐数据的动态内存分配
-
保证拷贝省略
- 终于
- 并非在所有情况下都是如此,但它区分了“只是创建了一个被称为省略的东西”和“真正的省略”的语法
-
修正了(某些)表达式的求值顺序
- 不包括函数参数,但现在禁止函数参数求值交错
- 使一堆坏代码大部分工作,并使
。然后在未来的工作中
-
枚举的直接列表初始化
-
前向进度保证(FPG)(也是并行算法的FPG)
- 我认为这是在说“实现可能不会永远停止线程”
-
u8'U',u8'T',u8'F',u8'8'字符文字(字符串已存在) -
类型系统中的“noexcept”
-
\u包含- 测试头文件是否包含错误
- 使从实验迁移到std几乎是无缝的
-
指针转换修复程序数组
-
继承的构造函数修复了某些特殊情况(有关行为更改的示例,请参见P0136R0)
-
使用继承聚合初始化
-
std::流槽,键入双关等
图书馆增刊:
数据类型
-
std::variant<;Ts.>- 我上次检查时几乎总是非空的
- 标记的联合类型
- {棒极了|有用}
-
std::可选- 也许有什么东西
- 可笑的有用
-
std::any- 保存任何内容之一(可复制)
-
std::string\u视图std::string类似于对字符数组或子字符串的引用- 切勿使用
字符串常量&再次。还可以使解析速度加快数百万倍 “你好世界”sv- constexpr
char\u traits
-
std::byte- 既不是整数也不是字符,只是数据
调用东西
std::invoke- 用一种语法调用任何可调用(函数指针、函数、成员指针)。从标准的调用概念
std::apply- 接受函数和元组,并将元组解压到调用中
-
std::make_from_tuple,std::apply应用于对象构造 -
可开票,可开票,调用结果- 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
- 不推荐的结果
是否可报销<;Foo(Args…),R>是“您可以使用Args…调用Foo并获取与R兼容的内容吗?”其中默认为R=voidinvoke\u结果<;Foo,Args…>是std::t的结果<;Foo(Args…)>但显然不那么混乱
文件系统TS v1
-
[class.path] -
[class.filesystem.error] -
[类文件\u状态] -
[class.directory\u entry] -
[class.directory\u iterator]和[class.recursive\u directory\u iterator] -
[fs.ops.funcs] -
fstreams可以用paths打开,也可以用const path::value\u type*字符串打开
新算法
-
用于每个 -
reduce -
transform\u reduce -
exclusive\u扫描 -
inclusive\u扫描 -
transform\u exclusive\u scan -
transform\u inclusive\u scan -
添加用于线程目的,即使未使用线程,也会公开
穿线
-
std::共享互斥体- 不定时,如果你不需要它,它可以更有效
-
原子<;T>::总是没有锁吗 -
范围锁定<;互斥体…>- 在一次锁定多个互斥锁时,节省一些
std::lock痛苦
- 在一次锁定多个互斥锁时,节省一些
-
并行度TS v1
- 2014年的相关文件可能已经过时
std算法和相关机器的并行版本
-
硬件干扰大小
(部分)以上或以下未涵盖的图书馆基础知识TS v1
[func.search]和[alg.search]- 一种搜索算法与技术
-
[pmr]- 多态分配器,如分配器的
std::function - 还有一些标准的内存资源
- http:
- 多态分配器,如分配器的