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
