C ++ 17有哪些新特性?
C ++ 17现在功能完整,所以不太可能遇到大的变化。 针对C ++ 17提出了数百个提案。
在C ++ 17中,哪些功能被添加到C ++中?
当使用支持“C ++ 1z”的C ++编译器时,当编译器更新到C ++ 17时,哪些功能将可用?
语言特点:
模板和通用代码
类模板的模板参数推导
template <auto>
非类型模板参数修复
template<template<class...>typename bob> struct foo {}
(折叠+ ... +表达式)和修订版
auto x{8};
是一个int
现代化using
...
和列表
LAMBDA
constexpr lambdas
在lambdas中捕获*this
[*this]{ std::cout << could << " be " << useful << 'n'; }
属性
[[fallthrough]]
, [[nodiscard]]
, [[maybe_unused]]
属性
namespace
和enum { erator[[s]] }
上的[[attributes]]
enum { erator[[s]] }
在属性中using
以避免重复属性名称空间。
编译器现在需要忽略它们不认识的非标准属性。
语法清理
内联变量
namespace A::B
简单的static_assert(expression);
没有字符串
除非throw()
和throw()
是否noexcept(true)
,否则不throw
。
清洁多回程和流量控制
结构化绑定
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
不能合理转换为bool的情况。 泛化基于范围的循环
如果constexpr
杂项
十六进制浮点文字
用于过度对齐数据的动态内存分配
保证复制elision
修改了(某些)表达式的一些修改的评估顺序
.then
在今后的工作中。 直接列表初始化枚举
前进进度保证(FPG)(并行算法的FPG)
u8'U', u8'T', u8'F', u8'8'
字符文字(字符串已经存在)
类型系统中的“noexcept”
__has_include
指针转换修复的数组
继承的构造函数修复了一些特殊情况(有关行为更改的示例,请参见P0136R0)
使用继承来聚合初始化。
std::launder
,类型双关等
图书馆增加:
数据类型
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string
像引用字符数组或子字符串 string const&
。 也可以使解析速度快了许多倍。 "hello world"sv
char_traits
std::byte
比他们可以咀嚼的更多。
调用东西
std::invoke
std::apply
std::make_from_tuple
, std::apply
应用于对象构造
is_invocable
, is_invocable_r
, invoke_result
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*
字符串打开。
新算法
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...>
std::lock
时可以节省一些std::lock
痛苦。 并行性TS v1
std
算法的并行版本和相关机器 硬件_ * _ interference_size
(部分)Library Fundamentals TS v1不在上面或下面
[func.searchers]
和[alg.search]
[pmr]
std::function
std::sample
,从一个范围抽样?
集装箱改进
try_emplace
和insert_or_assign
拼接map<>
, unordered_map<>
, set<>
和unordered_set<>
非const .data()
为字符串。
非成员std::size
, std::empty
, std::data
std::begin
/ end
容器中最小的不完整类型支持
连续迭代器“概念”
constexpr
迭代器
现在, emplace
系列函数返回对创建对象的引用。
智能指针更改
unique_ptr<T[]>
修复和其他unique_ptr
调整。 weak_from_this
和一些固定的从这个共享 其他std
数据类型改进:
{}
构建std::tuple
和其他改进 杂项
C ++ 17库基于C11而不是C99
为未来的标准库保留std[0-9]+
destroy(_at|_n)
, uninitialized_move(_n)
, uninitialized_value_construct(_n)
, uninitialized_default_construct(_n)
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::less
间接std::less
。 (由于名称被破坏,打破了一些编译器的ABI,被删除。) 性状
弃用
<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文章中获取的初始列表,其中链接通过Google搜索或从上面的isocpp.org页面添加。
从SD-6功能测试列表中掠夺更多条目。
铛的功能列表和库功能列表将被掠夺。 这似乎并不可靠,因为它是C ++ 1z,而不是C ++ 17。
这些幻灯片在其他地方缺少了一些功能。
虽然没有提出“被删除的内容”,但这里列出了一些在C ++ 17中从C ++中删除的一些内容(大多数?)以前的废弃)
删除:
register
,关键字保留供将来使用 bool b; ++b;
<functional>
stuff, random_shuffle
std::function
有重新词汇。 我不确定这些对代码是否有影响,或者它们只是标准中的清理:
尚未纳入上述文件的论文:
P0505R0(constexpr计时)
P0418R2(原子微调)
P0512R0(模板参数演绎调整)
P0490R0(结构化绑定调整)
P0513R0(更改为std::hash
)
P0502R0(并行例外)
P0509R1(更新异常处理限制)
P0012R1(使异常规范成为类型系统的一部分)
P0510R0(变体限制)
P0504R0(可选/变体/任何标签)
P0497R0(共享ptr调整)
P0508R0(结构化绑定节点句柄)
P0521R0(共享指针使用次数和唯一更改?)
规格更改:
进一步参考:
论文按年分组; 并非全部被接受
https://isocpp.org/files/papers/p0636r0.html