C++17
From cppreference.net
<
cpp
C++17 是一个主要版本,紧随次要版本 C++14 之后,引入了新的语言和库特性。该标准于 2017 年 12 月发布。
以下特性已并入 C++17:
- 来自 文件系统 TS : 文件系统库 。
- 来自 库基础 v1 TS :特性,包括 std::any 、 std::optional 、 std::string_view 、 std::apply 、 多态分配器 、 搜索器 。
- 来自 库基础 v2 TS : std::void_t 、 std::conjunction 、 std::disjunction 、 std::negation 、 std::not_fn 、 std::gcd 、 std::lcm 。
-
来自
并行性 v1 TS
:特性,包括
执行策略
、
std::reduce
、
std::inclusive_scan
、
std::exclusive_scan
,但移除了
exception_list。 - 来自 数学特殊函数 IS : 数学特殊函数 。
- 来自 C11: std::aligned_alloc 、 std::timespec_get 。
| 本节内容尚不完整 |
目录 |
已弃用功能
已移除功能
- std::auto_ptr ,
- 已弃用的函数对象 ,
- std::random_shuffle ,
- std::unexpected ,
-
过时的
iostream别名 , - 三字符组 ,
- register 关键字,
-
bool自增 , - 动态异常规范
已弃用功能
- std::iterator ,
- std::raw_storage_iterator ,
- std::get_temporary_buffer ,
- std::is_literal_type ,
- std::result_of ,
- <codecvt> 头文件中的所有内容
新语言特性
-
u8字符字面量 - 将 noexcept 纳入类型系统
- 新的 求值顺序 规则
- 对 * this 的 lambda 捕获
-
命名空间
- 简化的嵌套命名空间
-
using声明可声明多个名称 - 属性命名空间 无需重复指定
-
新增
属性
:
-
[[ fallthrough ]] -
[[ maybe_unused ]] -
[[ nodiscard ]]
-
- __has_include
新增头文件
新库特性
实用工具类型
内存管理
- 未初始化内存算法
- weak_from_this
- std::pmr::memory_resource 与 std::polymorphic_allocator
- std::aligned_alloc
- 透明 std::owner_less
- std::shared_ptr 的数组支持
- 具有显式对齐的 分配函数
编译时编程
- std::byte
- std::conjunction / std::disjunction / std::negation
-
类型特性
变量模板 (
xxx _+v) - std::is_swappable
- std::is_invocable
- std::is_aggregate
- std::has_unique_object_representations
算法
迭代器与容器
- map/set extract 与 map/set merge
- map/unordered_map try_emplace 与 insert_or_assign
- 连续迭代器 ( LegacyContiguousIterator )
- 非成员函数 std::size / std::empty / std::data
数值计算
- 数学特殊函数
- 3D std::hypot
其他
- 缓存行接口
- std::launder
- std::uncaught_exceptions
- std::to_chars / std::from_chars
- std::atomic<T>::is_always_lock_free
- std::scoped_lock
- std::timespec_get
- std::chrono::duration 和 std::chrono::time_point 的舍入函数
缺陷报告
编译器支持
C++17 核心语言特性
|
C++17 feature
|
Paper(s)
|
GCC
|
Clang
|
MSVC
|
Apple Clang
|
EDG eccp
|
Intel C++
|
Nvidia HPC C++ (ex PGI)*
|
Nvidia nvcc
|
Cray
|
Embarcadero C++ Builder
|
IBM Open XL C++ for AIX
|
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DR11: New auto rules for direct-list-initialization | N3922 | 5 | 3.8 | 19.0 (2015)* | Yes | 4.10.1 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| typename in a template template parameter | N4051 | 5 | 3.5 | 19.0 (2015)* | Yes | 4.10.1 | 17.0 | 17.7 | Yes* | 11.0 | 10.3 | 17.1.0 | |
| Removing trigraphs | N4086 | 5 | 3.5 | 16.0* | Yes | 5.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| Nested namespace definition | N4230 | 6 | 3.6 | 19.0 (Update 3)* | Yes | 4.12 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| static_assert with no message ( FTM ) * | N3928 | 6 | 2.5 | 19.10* | Yes | 4.12 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Attributes for namespaces and enumerators ( FTM ) * ( FTM ) * | N4266 |
4.9 (partial)*
6 |
3.6 | 19.0 (2015)* | Yes | 4.11 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
u8
character literals
|
N4267 | 6 | 3.6 | 19.0 (2015)* | Yes | 4.11 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Allow constant evaluation for all constant template arguments ( FTM ) * | N4268 | 6 | 3.6 | 19.12* | Yes | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Unary fold expressions and empty parameter packs | P0036R0 | 6 | 3.9 | 19.12* | Yes | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Remove deprecated use of the register keyword | P0001R1 | 7 | 3.8 | 19.11* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Remove deprecated operator ++ ( bool ) | P0002R1 | 7 | 3.8 | 19.11* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Make exception specifications part of the type system ( FTM ) * | P0012R1 | 7 | 4 | 19.12* | Yes | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| __has_include in preprocessor conditionals | P0061R1 | 5 | Yes | 19.11* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| DR11: New specification for inheriting constructors ( DR1941 et al) ( FTM ) * | P0136R1 | 7 | 3.9 | 19.14* * | Yes | 6.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| Aggregate classes with base classes ( FTM ) * | P0017R1 | 7 | 3.9 | 19.14* | Yes | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Fold Expressions ( FTM ) * | N4295 | 6 | 3.6 | 19.12* | Yes | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Lambda capture of * this ( FTM ) * | P0018R3 | 7 | 3.9 | 19.11* | Yes | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Direct-list-initialization of enumerations | P0138R2 | 7 | 3.9 | 19.11* | Yes | 4.14 | 18.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
constexpr
lambda expressions
(
FTM
)
*
|
P0170R1 | 7 | 5 | 19.11* | Yes | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Differing begin and end types in range-based for ( FTM ) * | P0184R0 | 6 | 3.9 | 19.10* | Yes | 4.12 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[
fallthrough
]]
attribute
|
P0188R1 | 7 | 3.9 | 19.10* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[
nodiscard
]]
attribute
|
P0189R1 | 7 | 3.9 | 19.11* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[
maybe_unused
]]
attribute
|
P0212R1 | 7 | 3.9 | 19.11* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Hexadecimal floating-point literals ( FTM ) * | P0245R1 | 3.0 | Yes | 19.11* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Using attribute namespaces without repetition | P0028R4 | 7 | 3.9 | 19.11* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Dynamic memory allocation for over-aligned data ( FTM ) * | P0035R4 | 7 | 4 | 19.12* | 10.0.0* | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Constant template parameters with auto type ( FTM ) * | P0127R2 | 7 | 4 | 19.14* | Yes | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Guaranteed copy elision ( FTM ) * | P0135R1 | 7 | 4 | 19.13* | Yes | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Replacement of class objects containing reference members | P0137R1 | 7 | 6 | 19.14* | Yes | 5.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| Stricter expression evaluation order | P0145R3 | 7 | 4 | 19.14* | Yes | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Structured Bindings ( FTM ) * | P0217R3 | 7 | 4 | 19.11* | Yes | 4.14 | 19.0 | 18.1 | 11.0* | 11.0 | 10.3 | 17.1.0 | |
| Ignore unknown attributes | P0283R2 | Yes | 3.9 | 19.0 (2015)* | Yes | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| constexpr if statements ( FTM ) * | P0292R2 | 7 | 3.9 | 19.11* | Yes | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Init-statements for if and switch | P0305R1 | 7 | 3.9 | 19.11* | Yes | 4.14 | 18.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Inline variables ( FTM ) * | P0386R2 | 7 | 3.9 | 19.12* | Yes | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Removing dynamic exception specifications | P0003R5 | 7 | 4 | 19.12* | Yes | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Pack expansions in using-declarations ( FTM ) * | P0195R2 | 7 | 4 | 19.14* | Yes | 5.0 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| DR98: Matching of template template-arguments excludes compatible templates ( FTM ) * | P0522R0 | 7 | 4 | 19.12* | Yes | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Class template argument deduction ( FTM ) * | P0091R3 | 7 | 5 | 19.14* | Yes | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
|
C++17 feature |
Paper(s) |
GCC
|
Clang
|
MSVC
|
Apple Clang
|
EDG eccp
|
Intel C++
|
Nvidia HPC C++ (ex PGI)*
|
Nvidia nvcc
|
Cray
|
Embarcadero C++ Builder
|
IBM Open XL C++ for AIX
|
C++17 标准库特性
|
C++17 feature
|
Paper(s)
|
GCC libstdc++
|
Clang libc++
|
MSVC STL
|
Apple Clang*
|
IBM Open XL C/C++ for AIX*
|
Intel Parallel STL
|
Embarcadero C++ Builder*
|
|
|---|---|---|---|---|---|---|---|---|---|
| std::void_t ( FTM ) * | N3911 | 6.1 | 3.6 | 19.0 (2015)* | Yes | 17.1.0 | N/A | 10.3 | |
| std::uncaught_exceptions() ( FTM ) * | N4259 | 6.1 | 3.7 | 19.0 (2015)* | Yes | 17.1.0 | N/A | 10.3 | |
| std::size() , std::empty() and std::data() ( FTM ) * | N4280 | 6 | 3.6 | 19.0 (2015)* | Yes | 17.1.0 | N/A | 10.3 | |
| std::allocator_traits::is_always_equal , noexcept cleanups ( FTM ) * | N4258 | 6.1 | 3.7 | 19.0 (2015)* | 17.1.0 | N/A | |||
| std::invoke ( FTM ) * | N4169 | 6.1 | 3.7 | 19.0 (2015)* | Yes | 17.1.0 | N/A | ||
| std::map::try_emplace , std::map::insert_or_assign ( FTM ) * | N4279 | 6.1 | 3.7 | 19.0 (2015)* | Yes | 17.1.0 | N/A | ||
| std::unordered_map::try_emplace , std::unordered_map::insert_or_assign ( FTM ) * | N4279 | 6.1 | 3.7 | 19.0 (2015)* | Yes | 17.1.0 | N/A | ||
| Improving std::pair and std::tuple | N4387 | 6.1 | 4 | 19.0 (Update 2)* | Yes | 17.1.0 | N/A | 10.3 | |
| std::bool_constant ( FTM ) * | N4389 | 6.1 | 3.7 | 19.0 (2015)* | Yes | 17.1.0 | N/A | 10.3 | |
| std::shared_mutex (untimed) ( FTM ) * | N4508 | 6 | 3.7 | 19.0 (Update 2)* | Yes | 17.1.0 | N/A | 10.3 | |
| Minimal incomplete type support for std::forward_list , std::list , and std::vector ( FTM ) * | N4510 | 3.0 | 3.6 | 18.0* | Yes | 17.1.0 | N/A | ||
| Type traits variable templates ( FTM ) * | P0006R0 | 7.1 | 3.8 | 19.0 (Update 2)* | Yes | 17.1.0 | N/A | 10.3 | |
| Logical operator type traits ( FTM ) * | P0013R1 | 6.1 | 3.8 | 19.0 (Update 2)* | Yes | 17.1.0 | N/A | 10.3 | |
| std::as_const ( FTM ) * | P0007R1 | 7.1 | 3.8 | 19.0 (Update 2)* | Yes | 17.1.0 | N/A | ||
| Rounding functions for std::chrono::duration and std::chrono::time_point ( FTM ) * | P0092R1 | 7.1 | 3.8 | 19.0 (Update 2)* | Yes | 17.1.0 | N/A | ||
| Transparent std::owner_less ( std::owner_less<void> ) ( FTM ) * | P0074R0 | 7.1 | 3.8 | 19.0 (Update 2)* | Yes | 17.1.0 | N/A | ||
| std::not_fn ( FTM ) * |
P0005R4
P0358R1 |
7.1 | 3.9 | 19.12* | Yes | 17.1.0 | N/A | 10.3 | |
| Parallel algorithms and execution policies ( FTM ) * ( FTM ) * | P0024R2 | 9* |
17
(partial)* |
19.14* | 18.0* | ||||
| std::clamp() ( FTM ) * | P0025R1 | 7 | 3.9 | 19.0 (Update 3)* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| (nothrow-)swappable traits ( FTM ) * | P0185R1 | 7.1* | 3.9 | 19.0 (Update 3)* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| Polymorphic memory resources ( FTM ) * | P0220R1 | 9.1 | 16 | 19.13* | 15.0.0* | 17.1.1 | N/A | 10.3 | |
| std::apply ( FTM ) * | P0220R1 | 7.1 | 16 | 19.13* | Yes | 17.1.0 | N/A | ||
| Searchers ( FTM ) * | P0220R1 | 7.1 | 16 | 19.13* | Yes | 17.1.0 | N/A | ||
| std::sample ( FTM ) * | P0220R1 | 7.1 | 16 | 19.13* | Yes | 17.1.0 | N/A | ||
| Mathematical special functions ( FTM ) * | P0226R1 | 7 | 19.14* | 17.1.1 | N/A | 10.3 | |||
| constexpr std::addressof ( FTM ) * | LWG2296 | 7.1 | Yes | 19.0 (Update 3)* | 17.1.0 | N/A | |||
| constexpr for std::reverse_iterator , std::move_iterator , std::array and range access ( FTM ) * | P0031R0 | 7.1 | 4 | 19.11* | Yes | 17.1.0 | N/A | ||
| constexpr std:: atomic < T > :: is_always_lock_free ( FTM ) * | P0152R1 | 7.1 | 3.9 | 19.11* | Yes | 17.1.0 | N/A | ||
| std::enable_shared_from_this::weak_from_this ( FTM ) * | P0033R1 | 7.1 | 3.9 | 19.12* | Yes | 17.1.0 | N/A | ||
| 3-argument overload of std::hypot ( FTM ) * | P0030R1 | 7.1 | 3.9 | 19.14* | Yes | 17.1.0 | N/A | ||
| std::byte ( FTM ) * | P0298R3 | 7 | 5 | 19.11* | Yes | 17.1.1 | N/A | 10.3 | |
| std::string_view ( FTM ) * |
N3921
P0220R1 P0254R2 P0403R1 |
7.1 | 4 |
19.10*
(partial)*
19.11* * |
10.0.0* | 17.1.0 | N/A | 10.3 | |
| std::any ( FTM ) * |
P0220R1
P0032R3 |
7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| std::optional ( FTM ) * | P0220R1 | 7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| Major portion of C11 standard library | P0063R3 | 9.1 | 7 |
19.0 (2015)*
(partial)* |
10.0.0* | 17.1.1 | N/A | ||
| Splicing Maps and Sets ( FTM ) * | P0083R3 | 7 | 8 | 19.12* | 10.0.0* | 17.1.1 | N/A | ||
| return type of emplace * functions of some containers changed from void to reference | P0084R2 | 7.1 | 4.0 | 19.11* | Yes | 17.1.0 | N/A | ||
| std::variant ( FTM ) * | P0088R3 | 7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| std::make_from_tuple() ( FTM ) * | P0209R2 | 7.1 | 3.9 | 19.10* | Yes | 17.1.0 | N/A | 10.3 | |
| std::has_unique_object_representations ( FTM ) * | P0258R2 | 7.1 | 6 | 19.11* | Yes | 17.1.1 | N/A | 10.3 | |
| std::gcd() and std::lcm() ( FTM ) * | P0295R0 | 7 | 4 | 19.11* | Yes | 17.1.0 | N/A | 10.3 | |
| CWG issue 1776 : Replacement of class objects containing reference members ( std::launder ) ( FTM ) * | P0137R1 | 7.1 | 6 | 19.14* | Yes | 17.1.0 | N/A | ||
| Extending memory management tools ( FTM ) * | P0040R3 | 7.1 | 4 | 19.11* | 17.1.0 | N/A | |||
| shared_ptr::weak_type ( FTM ) * | P0163R0 | 7.1 | 3.9 | 19.10* | Yes | 17.1.0 | N/A | ||
| Elementary string conversions : std:: to_chars / std:: from_chars ( FTM ) * | P0067R5 |
8*
11 |
7*
14* 20* |
19.14*
*
19.24* |
10.0.0* * | 17.1.1* | N/A | 10.3* | |
| std::shared_ptr and std::weak_ptr with array support | P0414R2 | 7 | 11 | 19.12* | 12.0.0* | 17.1.1 | N/A | 10.3 | |
| Constexpr for all the member functions of std::chrono::duration and std::chrono::time_point ( FTM ) * | P0505R0 | 7.1 | 4 | 19.11* | Yes | 17.1.1 | N/A | ||
| std:: shared_ptr < T [ ] > ( FTM ) * | P0497R0 | 7.1 | 11 | 19.12* | 17.1.1 | N/A | |||
| constexpr std::char_traits ( FTM ) * | P0426R1 | 8.1 | 4 | 19.14* | Yes | 17.1.1 | N/A | ||
| File system library ( std::filesystem ) ( FTM ) * |
P0218R1
P0219R1 |
8 | 7 | 19.14* | 11.0.0* | 17.1.1 | N/A | 10.3 | |
| Hardware interference size ( FTM ) * | P0154R1 | 12.1 |
15 (partial)*
19 |
19.11* | N/A | 10.3 | |||
| std::scoped_lock ( FTM ) * | P0156R2 | 7 | 5 | 19.11* | Yes | 17.1.1 | N/A | 10.3 | |
| std::is_aggregate ( FTM ) * | LWG2911 | 7 | 5 | 19.15* | Yes | 17.1.1 | N/A | 10.3 | |
| std::is_invocable , std::invoke_result ( FTM ) * | P0604R0 | 7.1 | Yes | 19.11* | Yes | 17.1.1 | N/A | ||
| DR17: std::hash<std::filesystem::path> | LWG3657 | 11.4 | 17 | 19.32* | N/A | ||||
|
C++17 feature |
Paper(s) |
GCC libstdc++
|
Clang libc++
|
MSVC STL
|
Apple Clang*
|
IBM Open XL C/C++ for AIX*
|
Intel Parallel STL
|
Embarcadero C++ Builder*
|
注释
- 截至2020年11月20日,Oracle Developer Studio 最新版本为12.6 。其 官方文档 未提及对C++17的支持。
- Cray编译器可能在11.0版本之前就已支持部分特性。该版本标志着其转型为Clang的衍生版本,继承了基础编译器的全部语言特性支持。详见 Cray/HPE技术文档S-2179 。
*
- 将鼠标悬停在标有星号
*
的单元格上可查看附加弹出注释。
DR
nn
- "DR" 后的数字
nn
表示缺陷报告所适用的目标 C++ 修订版本,例如 DR20 → C++20。
外部链接
| 1. | C++17 - 维基百科 |
| 2. | 可运行的C++17示例 |