提问人: 提问时间:6/28/2016 最后编辑:Yakk - Adam Nevraumont 更新时间:11/10/2022 访问量:248265
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/p0512r0
-
- 表示任何(非类型模板参数)类型的值。
Lambda
-
- 如果 Lambda 符合条件,则它们隐式为 constexpr
-
[*this]{ std::cout << could << " be " << useful << '\n'; }
属性
[[
fallthrough
]]、[[nodiscard]]
、[[maybe_unused]]
属性使用
in 属性可避免重复属性命名空间。编译器现在需要忽略它们无法识别的非标准属性。
- C++14 的措辞允许编译器拒绝未知的作用域属性。
语法清理
-
- 类似于内联函数
- 编译器选择实例实例化的位置
- 弃用静态 constexpr 重新声明,现在是隐式内联的。
简单
static_assert(表达式);
不带字符串除非
throw()
否则 nothrow
,并且是 .throw()
noexcept(true)
更清洁的多回油和流量控制
-
- 基本上,一流的
std::tie
auto
- 例:
const auto [it, inserted] = map.insert( {"foo", bar} );
- 创建变量,并从返回的 中推断出类型。
it
inserted
pair
map::insert
- 适用于元组/类元组和相对扁平的结构
std::array
- 在标准中实际命名的结构化绑定
- 基本上,一流的
if (init; condition) 和
switch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
- 将范围扩展到不能合理地转换为布尔值的情况。
if(decl)
decl
-
- 似乎主要支持哨兵,或与开始迭代器类型不同的结束迭代器,这有助于处理以 null 结尾的循环等。
-
- 非常需要的功能来简化几乎通用的代码。
杂项
-
- 最后!
- 并非在所有情况下,但将“只是创造一些东西”的语法与“真正的省略”区分开来。
-
- 不包括函数参数,但函数参数计算交错现在被禁止
- 使一堆损坏的代码主要工作,并使将来的工作。
.then
前向进度保证 (FPG)(也包括并行算法的 FPG)
- 我认为这是在说“实现可能不会永远停滞线程”?
u8'U'、u8'T'、u8'F'
、u8'8'
字符文本(字符串已存在)-
- 测试头文件包含是否为错误
- 从实验性到性病的迁移几乎是无缝的
新增库:
数据类型
-
- 我上次检查的几乎总是非空的?
- 标记的联合类型
- {awesome|有用}
-
- 也许持有某物之一
- 荒谬地有用
-
- 包含任何内容之一(可复制)
-
std::string
如对字符数组或子字符串的引用- 再也不用服用了。还可以使解析速度提高 bajillion 倍。
string const&
"hello world"sv
- constexpr
char_traits
std::byte
off 比他们能咀嚼的多。- 既不是整数也不是字符,只是数据
调用东西
-
- 使用一种语法调用任何可调用对象(函数指针、函数、成员指针)。从标准的 INVOKE 概念。
-
- 采用类似函数的元组和元组,并将元组解压缩到调用中。
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>
是“你能打电话并得到兼容的东西吗”,其中是默认值。Foo
Args...
R
R=void
invoke_result<Foo, Args...>
但显然不那么令人困惑?std::result_of_t<Foo(Args...)>
文件系统 TS v1
新算法
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
为线程目的添加,即使您没有使用线程化它们,也会公开它们
线程
-
- 不定时,如果您不需要它,这可能会更有效率。
atomic<T>
::is_always_lockfree
-
- 一次锁定多个互斥锁时可以省去一些痛苦。
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<>
的拼接- 在容器之间以低廉的价格移动节点。
- 以低廉的价格合并整个容器。
non-const
.data()
用于字符串。非成员 std::size、std::
empty、std
::d ata
- 喜欢
std::begin
/end
- 喜欢
函数系列现在返回对所创建对象的引用。
emplace
智能指针更改
unique_ptr<T[]>
修复和其他unique_ptr
调整。weak_from_this
和一些固定的共享从这里
其他数据类型改进:std
杂项
C++ 库基于 C11 而不是 C99
为将来的标准库保留
std[0-9]+
-
- 实用程序代码已在大多数实现中公开
std
- 实用程序代码已在大多数实现中公开
-
- 科学家可能会喜欢它们
-
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
大约
-
- 如果只想在安全的情况下抛出析构函数,则为必需
-
- 在编写模板时非常有用
-
- 像 ,但智能指针要根据内容进行排序
std::less<void>
- 像 ,但智能指针要根据内容进行排序
std::is_contiguous_layout,可用于高效散列
std::to_chars/std::from_chars,高性能,与区域设置无关的数字转换;最后是一种将序列化/反序列化为人类可读格式(JSON & co)的方法
std::d efault_order,间接超过(由于名称修改,某些编译器的 ABI 被破坏,已删除。std::less
。memory_order_consume
,添加了优先使用memory_order_acquire
性状
荒废的
- 一些 C 库,
<codecvt>
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++ 中删除的一些内容((大部分?)以前已弃用)的简短列表:
删除:
注册
,保留关键字以备将来使用bool b; ++b;
- 三相片
- 如果您仍然需要它们,它们现在是源文件编码的一部分,而不是语言的一部分
- IOS 别名
- auto_ptr,旧的
<功能>
的东西,random_shuffle
std::function
中的分配器
有改写。我不确定这些是否对代码有任何影响,或者它们是否只是标准中的清理:
尚未纳入上述内容的论文:
P0505R0 (constexpr chrono)
P0418R2(原子调整)
P0512R0(模板参数推导调整)
P0490R0(结构化绑定调整)
P0513R0(更改为
std::hash
)P0502R0(并行例外)
P0509R1(更新异常处理限制)
P0012R1(使异常规范成为类型系统的一部分)
P0510R0(对变体的限制)
P0504R0(可选/变体/任何标记)
P0497R0(共享 PTR 调整)
P0508R0(结构化绑定节点句柄)
P0521R0(共享指针使用计数和唯一更改?
规格更改:
更多参考资料:
https://isocpp.org/files/papers/p0636r0.html
- 应在此处更新为“对现有功能的修改”。
评论
memory_order_consume
评论