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::tieauto - 例:
-
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::byteclosures比他们可以咀嚼。- 既不是一个整数也不是一个字符,只是数据
调用东西
-
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...调用FooArgs...并获得与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] -
fstreams可以用paths打开,也可以用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年的链接文件可能已经过时
-
stdalgorithm的并行版本,以及相关的机器
-
硬件_ * _ 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”。