C ++ 17有哪些新特性?
C ++ 17现在function完整,所以不太可能经历大的变化。 针对C ++ 17提出了数百个提案。
在C ++ 17中,哪些function被添加到C ++中?
当使用支持“C ++ 1z”的C ++编译器时,当编译器更新到C ++ 17时,哪些function将可用?
语言特点:
模板和通用代码
-
类模板的模板参数推导
- 就像函数如何推导模板参数一样,现在构造函数可以推导出类的模板参数
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
-
template <auto>
- 表示任何(非types模板参数)types的值。
-
非types模板参数修复
-
template<template<class...>typename bob> struct foo {}
-
(折叠+ … +expression式)和修订
-
auto x{8};
是一个int
-
现代化
using
...
和列表
LAMBDA
-
constexpr lambdas
- 如果符合条件,Lambda将被隐含地表示为constexpr
-
在lambdas中捕获
*this
-
[*this]{ std::cout << could << " be " << useful << '\n'; }
-
属性
-
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
属性 -
namespace
和enum { erator[[s]] }
上的[[attributes]]
enum { erator[[s]] }
-
在属性中
using
以避免重复属性名称空间。 -
编译器现在需要忽略它们不认识的非标准属性 。
- C ++ 14的措辞允许编译器拒绝未知范围的属性。
语法清理
-
内联variables
- 像内联函数一样
- 编译器select实例的实例化位置
- 弃用静态constexpr重新声明 ,现在隐式内联。
-
namespace A::B
-
简单的
static_assert(expression);
没有string -
除非
throw()
和throw()
是noexcept(true)
否则不throw
。
清洁多回程和stream量控制
-
结构化的绑定
- 基本上,一stream的
std::tie
auto
- 例:
-
const auto [it, inserted] = map.insert( {"foo", bar} );
- 从
map::insert
返回的pair
创buildvariables并inserted
推导types。
-
- 适用于tuple / pair-likes&
std::array
和相对扁平的结构 - 实际上在标准中命名结构化的绑定
- 基本上,一stream的
-
if (init; condition)
和switch (init; condition)
-
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
- 将
if(decl)
扩展到decl
不能合理转换为bool的情况。
-
-
泛化基于范围的循环
- 似乎主要是支持标记,或者结束与迭代器不同types的迭代器,这有助于以null结尾的循环等。
-
如果constexpr
- 许多要求的function可以简化几乎通用的代码。
杂项
-
hex浮点文字
-
dynamic内存分配的过度alignment的数据
-
保证复制elision
- 最后!
- 不是所有情况下,但是区分从“真正的省略”到“正在创造什么”的语法。
-
修改 了(某些)expression式的一些修改 的评估顺序
- 不包括函数参数,但函数参数评估交错现在被禁止
- 主要是使一堆破碎的代码工作,并在未来的工作。
-
直接列表初始化枚举
-
前进进度保证(FPG)(也称为并行algorithm的 FPG)
- 我想这是说“执行不会永远停止线程”?
-
u8'U', u8'T', u8'F', u8'8'
字符文字(string已经存在) -
types系统中的“noexcept”
-
__has_include
- testing一个头文件是否包含错误
- 使从实验迁移到std几乎是无缝的
-
指针转换修复的数组
-
inheritance的构造函数修复了一些转angular情况(有关行为更改的示例,请参见P0136R0 )
-
使用inheritance来聚合初始化 。
-
std::launder
,打字等
图书馆增加:
数据types
-
std::variant<Ts...>
- 最后我几乎总是非空的检查?
- 标记的联合types
- {真棒|有用}
-
std::optional
- 也许有一个东西
- 可笑有用
-
std::any
- 拥有任何东西(这是可复制的)
-
std::string_view
-
std::string
像引用字符数组或子string - 切勿再次使用
string const&
。 也可以使parsing一个bajillion倍更快。 -
"hello world"sv
- constexpr
char_traits
-
-
std::byte
closures比他们可以咀嚼。- 既不是一个整数也不是一个字符,只是数据
调用东西
-
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.path]
-
[class.filesystem.error]
-
[class.file_status]
-
[class.directory_entry]
-
[class.directory_iterator]
和[class.recursive_directory_iterator]
[class.directory_iterator]
[class.recursive_directory_iterator]
-
[fs.ops.funcs]
-
fstream
s可以用path
s打开,也可以用const path::value_type*
串打开。
新的algorithm
-
for_each_n
-
reduce
-
transform_reduce
-
exclusive_scan
-
inclusive_scan
-
transform_exclusive_scan
-
transform_inclusive_scan
-
为了线程的目的而添加,即使你没有使用线程也是暴露的
穿线
-
std::shared_mutex
- 不带时间,如果你不需要它可以更有效率。
-
atomic<T>
::is_always_lockfree
-
scoped_lock<Mutexes...>
- 一次locking多个互斥
std::lock
时保存一些std::lock
痛苦。
- 一次locking多个互斥
-
并行性TS v1
- 2014年的链接文件可能已经过时
-
std
algorithm的并行版本,以及相关的机器
-
硬件_ * _ interference_size
(部分) Library Fundamentals TS v1不在上面或下面
-
[func.searchers]
和[alg.search]
- searchalgorithm和技术
-
[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()
为string。 -
非成员
std::size
,std::empty
,std::data
- 像
std::begin
/end
- 像
-
容器中最小的不完整types支持
-
连续迭代器“概念”
-
constexpr
迭代器 -
现在,
emplace
系列函数返回对创build对象的引用 。
智能指针更改
-
unique_ptr<T[]>
修复和其他unique_ptr
调整。 -
weak_from_this
和一些固定的从这个共享
其他std
数据types改进:
-
{}
构buildstd::tuple
等改进 - TriviallyCopyable reference_wrapper ,可以提升性能
杂项
-
C ++ 17库基于C11而不是C99
-
为未来的标准库保留
std[0-9]+
-
destroy(_at|_n)
,uninitialized_move(_n)
,uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
- 实用程序代码已经在大多数
std
实现中暴露
- 实用程序代码已经在大多数
- 特殊的math函数
- 科学家可能会喜欢他们
-
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
模板variables -
std::void_t<T>
- 编写模板时非常有用
-
std::owner_less<void>
- 像
std::less<void>
,但对于基于内容进行sorting的智能指针
- 像
-
std::chrono
波兰语 -
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
。
性状
- 交换
- is_aggregate
- has_unique_object_representations
弃用
- 一些C库 ,
-
<codecvt>
-
memory_order_consume
-
result_of
,replace为invoke_result
-
shared_ptr::unique
,它不是非常安全的
自从C ++ 14以来, Isocpp.org已经有了一个独立的更改列表; 它已被部分掠夺。
自然TS工作并行进行,所以有一些TS不太成熟,需要等待下一次迭代。 下一次迭代的目标是按照以前计划的C ++ 20,而不是一些传言所暗示的C ++ 19。 C ++ 10已经被避免了。
从这个reddit文章和这个reddit文章中获取的初始列表,通过谷歌search或从上面的isocpp.org页面添加的链接。
从SD-6functiontesting列表中掠夺更多条目。
铛的function列表和库function列表将被掠夺。 这似乎并不可靠,因为它是C ++ 1z,而不是C ++ 17。
这些幻灯片有其他一些function丢失。
虽然“什么被删除”没有被问到,这里是一些简短的列表(大多数?)以前的弃用)从C ++中删除的C + + 17:
删除:
-
register
,关键字保留供将来使用 -
bool b; ++b;
- 三合
- 如果你仍然需要它们,它们现在是你的源文件编码的一部分,而不是语言的一部分
- ios别名
- auto_ptr,旧的
<functional>
stuff,random_shuffle
- 在
std::function
分配器
有重新词汇。 我不确定这些代码是否对代码有影响,或者只是标准中的清理:
尚未纳入上述文件的论文:
-
P0505R0 (constexpr计时)
-
P0418R2 (primefaces调整)
-
P0512R0 (模板参数演绎调整)
-
P0490R0 (结构化绑定调整)
-
P0513R0 (更改为
std::hash
) -
P0502R0 (并行例外)
-
P0509R1 (更新exception处理限制)
-
P0012R1 (使exception规范成为types系统的一部分)
-
P0510R0 (对变体的限制)
-
P0504R0 (标签为可选/变体/任何)
-
P0497R0 (共享ptr调整)
-
P0508R0 (结构化绑定节点句柄)
-
P0521R0 (共享指针使用次数和唯一更改?)
规格更改:
- exception规格和抛出expression式
进一步参考:
-
论文按年分组; 并非全部被接受
-
https://isocpp.org/files/papers/p0636r0.html
- 应该在这里更新为“修改现有function”。