C ++ 17现在功能齐全,因此不太可能经历大的变化。 为C ++ 17提出了数百个提案。
在C ++ 17中,哪些特性被添加到C ++中?
当使用支持“C ++ 1z”的C ++编译器时,当编译器更新到C ++ 17时,哪些功能可用?
#1楼
语言特色:
模板和通用代码
-
- 就像函数如何推导模板参数一样,现在构造函数可以推导出类的模板参数
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
-
- 表示任何(非类型模板参数)类型的值。
LAMBDA
-
- 如果Lambdas符合条件,他们就会隐瞒constexpr
-
-
[*this]{ std::cout << could << " be " << useful << '\\n'; }
-
属性
在属性中
using
以避免重复属性命名空间。编译器现在需要忽略它们无法识别的非标准属性 。
- C ++ 14的措辞允许编译器拒绝未知的范围属性。
语法清理
-
- 像内联函数
- 编译器选择实例实例化的位置
- 弃用静态constexpr重新声明 ,现在隐式内联。
简单的
static_assert(expression);
没有字符串没有
throw
,除非throw()
和throw()
是noexcept(true)
。
更清洁的多回程和流量控制
-
- 基本上,一流的
std::tie
与auto
- 例:
-
const auto [it, inserted] = map.insert( {"foo", bar} );
- 创建的变量
it
并inserted
与来自推定的类型pair
那个map::insert
回报。
-
- 使用元组/对喜欢&
std::array
s和相对平坦的结构 - 实际上在标准中命名为结构化绑定
- 基本上,一流的
if (init; condition)
和switch (init; condition)
-
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
- 将
if(decl)
扩展到decl
不可转换为bool的情况。
-
-
- 似乎主要支持哨兵,或者结束与开始迭代器类型不同的迭代器,这有助于使用以null结尾的循环等。
-
- 许多要求的功能,以简化几乎通用的代码。
杂项
-
- 最后!
- 并非在所有情况下,但区分语法,你从“真正的省略”,“只是创造一些被称为elision的东西”。
通过一些修改 修复(某些)表达式的评估顺序
- 不包括函数参数,但现在禁止函数参数评估交错
- 使一堆破碎的代码大部分工作,并使之
.then
在未来的工作。
前向进度保证(FPG)(也称为并行算法的 FPG)
- 我认为这是说“实施可能不会永远拖延线程”?
u8'U', u8'T', u8'F', u8'8'
字符文字(字符串已存在)-
- 测试头文件是否包含错误
- 使得从实验迁移到std几乎是无缝的
图书馆补充:
数据类型
-
- 我最后检查几乎总是非空的?
- 标记的联合类型
- {真棒|有用}
-
- 也许是其中之一
- 非常有用
-
- 保留任何东西(可复制)
-
-
std::string
like reference-to-character-array或substring - 永远不要再使用
string const&
。 也可以使解析速度提高5倍。 -
"hello world"sv
- constexpr
char_traits
-
std::byte
off比他们可以咀嚼的多。- 既不是整数也不是字符,只是数据
调用东西
-
std::invoke
- 使用一种语法调用任何可调用的(函数指针,函数,成员指针)。 从标准的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<Foo(Args...), R>
是“你可以用Args...
调用Foo
Args...
并获得与R
兼容的东西”,其中R=void
是默认值。 -
invoke_result<Foo, Args...>
是std::result_of_t<Foo(Args...)>
但显然不那么令人困惑?
文件系统TS v1
[class.directory_iterator]
和[class.recursive_directory_iterator]
[class.directory_iterator]
[class.recursive_directory_iterator]
新算法
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
添加用于线程目的,即使您没有使用它们也会暴露
穿线
-
- 不定时,如果你不需要它可以更有效。
atomic<T>
::is_always_lockfree
-
- 一次锁定多个互斥
std::lock
时,可以节省一些std::lock
痛苦。
- 一次锁定多个互斥
-
- 2014年的链接文件可能已过期
-
std
算法和相关机器的并行版本
(部分) 图书馆基础知识TS v1未在上文或下文中介绍
-
[func.searchers]
和[alg.search]
- 搜索算法和技术
-
- 多态分配器,如分配器的
std::function
- 还有一些标准的内存资源 。
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
- 多态分配器,如分配器的
std::sample
,从一个范围中抽样?
集装箱改进
-
- 在虚假移动/复制不好的某些情况下,可以提供更好的保证
拼接
map<>
,unordered_map<>
,set<>
和unordered_set<>
- 便宜地在容器之间移动节点。
- 便宜地合并整个容器。
字符串的非const
.data()
。非成员
std::size
,std::empty
,std::data
- 比如
std::begin
/end
- 比如
emplace
系列函数现在返回对创建对象的引用 。
智能指针变化
-
unique_ptr<T[]>
修正和其他unique_ptr
调整。 -
weak_from_this
和一些固定为共享的
其他std
数据类型的改进:
杂项
C ++ 17库基于C11而不是C99
保留
std[0-9]+
用于未来的标准库-
- 实用程序代码已经暴露在大多数
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<T>
- 在编写模板时非常有用
-
std::owner_less<void>
- 比如
std::less<void>
,但是对于基于内容排序的智能指针
- 比如
-
std::chrono
polish -
std::conjunction
,std::disjunction
,std::negation
公开 -
std::not_fn
-
std
内的noexcept规则 - std :: is_contiguous_layout ,对高效散列很有用
- std :: to_chars / std :: from_chars ,高性能,区域设置不可知的数字转换; 最后一种序列化/反序列化为人类可读格式的方法(JSON&co)
-
std :: default_order ,间接超过(由于名称损坏,删除了一些编译器的ABI 。)std::less
。
性状
弃用
- 一些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帖子中获取的初始列表,通过谷歌搜索或从上面的isocpp.org页面添加链接。
从SD-6功能测试列表中掠夺的其他条目。
clang的功能列表和库功能列表接下来将被掠夺。 这似乎不可靠,因为它是C ++ 1z,而不是C ++ 17。
这些幻灯片在其他地方缺少一些功能
虽然没有问“删除了什么”,但这里有一些简短的列表,列出了C ++ 17中从C ++中删除的一些东西((大多数是?)以前弃用的东西):
删除:
-
register
,保留供将来使用的关键字 -
bool b; ++b;
- 三合
- 如果您仍然需要它们,它们现在是源文件编码的一部分,而不是语言的一部分
- ios别名
- auto_ptr,旧的
<functional>
stuff,random_shuffle
-
std::function
分配器
有重写。 我不确定这些是否对代码有任何影响,或者它们是否只是标准中的清理:
尚未整合到上面的论文:
P0418R2 (原子调整)
P0512R0 (模板参数扣除调整)
P0490R0 (结构化绑定调整)
P0513R0 (更改为
std::hash
)P0502R0 (并行异常)
P0509R1 (更新异常处理限制)
P0012R1 (使异常规范成为类型系统的一部分)
P0510R0 (变体限制)
P0504R0 (可选/变体/任意标签)
P0497R0 (共享ptr调整)
P0508R0 (结构化绑定节点句柄)
P0521R0 (共享指针使用计数和唯一更改?)
规格变化:
进一步参考:
https://isocpp.org/files/papers/p0636r0.html
- 应在此处更新为“对现有功能的修改”。