C++20
cppreference.com
< cpp
The current revision of the C++ standard
| This section is incomplete |
New language features
- Feature test macros
- 3-way comparison operator
<=>andoperator==() = default - designated initializers
- init-statements and initializers in range-
for - char8_t
- New attributes:
[[no_unique_address]],[[likely]],[[unlikely]] - pack-expansions in lambda init-captures
- removed the requirement to use
typenameto disambiguate types in many contexts - consteval, constinit
- further relaxed constexpr
- signed integers are 2's complement
- aggregate initialization using parentheses
- Coroutines
- Modules
- Constraints and concepts
- Abbreviated function templates
- DR: array new can deduce array size
New library features
New headers
- <concepts>
- <coroutine>
- <compare>
- <version>
- <source_location>
- <format>
- <span>
- <ranges>
- <bit>
- <numbers>
- <syncstream>
Library features
- Library feature-test macros
- Formatting library
- Calendar and Time Zone library
- source_location
- span
- endian
- array support for make_shared
- remove_cvref
- to_address
- floating-point atomics, shared_ptr atomics
- thread-coordination classes: barrier, latch, and counting_semaphore
- jthread and thread cancellation classes: stop_token, stop_source, and stop_callback
- basic_osyncstream
- u8string and other
char8_tuses - constexpr for <algorithm>, <utility>, <complex>
- string::starts_with / ends_with and string_view::starts_with / ends_with
- assume_aligned
- bind_front
- c8rtomb/mbrtoc8
- make_obj_using_allocator etc
- make_shared_for_overwrite/make_unique_for_overwrite
- heterogeneous lookup in unordered associative containers
- polymorphic_allocator with additional member functions and byte as its default template argument
- execution::unseq
- midpoint and lerp
- ssize
- is_bounded_array, is_unbounded_array
- Ranges
- uniform container erasure: std::erase/std::erase_if, e.g. std::erase(std::list) or erase_if(std::map) etc
- Mathematical constants in <numbers>
Defect reports
Compiler support
Main Article: C++ compiler support
C++20 core language features
| C++20 feature |
Paper(s) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
IBM XLC++ |
Sun/Oracle C++ |
Embarcadero C++ Builder |
Cray |
Nvidia HPC C++ (ex Portland Group/PGI) |
Nvidia nvcc |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Allow lambda-capture [=, this]
|
P0409R2 | 8 | 6 | 19.22* |
10.0.0* |
5.1 | 20.7 | |||||||
__VA_OPT__
|
P0306R4 P1042R1 |
8 (partial)* 10 (partial)* 12 |
9 | 19.25* |
11.0.3* |
5.1 | 20.7 | |||||||
| Designated initializers | P0329R4 | 4.7 (partial)* 8 |
3.0 (partial)* 10 |
19.21* | (partial)* | 5.1 | 20.7 | |||||||
| template-parameter-list for generic lambdas | P0428R2 | 8 | 9 | 19.22* |
11.0.0* |
5.1 | 20.7 | |||||||
| Default member initializers for bit-fields | P0683R1 | 8 | 6 | 19.25* |
10.0.0* |
5.1 | 20.7 | |||||||
| Initializer list constructors in class template argument deduction | P0702R1 | 8 | 6 | 19.14* | Yes | 5.0 | 20.7 | |||||||
const&-qualified pointers to members
|
P0704R1 | 8 | 6 | 19.0 (2015)* |
10.0.0* |
5.1 | 20.7 | |||||||
| Concepts | P0734R0 | 6 (TS only) 10 |
10 | 19.23* (partial)* 19.30* |
12.0.0* (partial) |
6.1 | 20.11 | |||||||
| Lambdas in unevaluated contexts | P0315R4 | 9 | 13 (partial)* 14 (partial)* |
19.28 (16.8)* | ||||||||||
| Three-way comparison operator | P0515R3 | 10 | 8 (partial) 10 |
19.20* | 5.1 | 20.7 | ||||||||
| DR: Simplifying implicit lambda capture | P0588R1 | 8 | 19.24* | 5.1 | 20.7 | |||||||||
| init-statements for range-based for | P0614R1 | 9 | 8 | 19.25* |
11.0.0* |
6.0 | 20.11 | |||||||
| Default constructible and assignable stateless lambdas | P0624R2 | 9 | 8 | 19.22* |
10.0.1* |
5.1 | 20.7 | |||||||
const mismatch with defaulted copy constructor
|
P0641R2 | 9 | 8 | 19.0 (2015)* |
10.0.1* |
5.1 | 20.7 | |||||||
| Access checking on specializations | P0692R1 | Yes | 8 (partial) 14 |
19.26* |
10.0.1* (partial) |
5.1 | 20.7 | |||||||
| ADL and function templates that are not visible | P0846R0 | 9 | 9 | 19.21* |
11.0.3* |
5.1 | 20.7 | |||||||
DR: Specify when constexpr function definitions are needed for constant evaluation
|
P0859R0 | 5.2 (partial)* 9 |
8 | 19.27* (partial)* 19.31* |
||||||||||
Attributes [[likely]] and [[unlikely]]
|
P0479R5 | 9 | 12 | 19.26* |
13.0.0* |
5.1 | 20.7 | |||||||
| Make typename more optional | P0634R3 | 9 | 19.29 (16.10)* | 5.1 | 20.7 | |||||||||
| Pack expansion in lambda init-capture | P0780R2 | 9 | 9 | 19.22* |
11.0.3* |
6.1 | 20.11 | |||||||
Attribute [[no_unique_address]]
|
P0840R2 | 9 | 9 | 19.28 (16.9)** |
11.0.3* |
5.1 | 20.7 | |||||||
| Conditionally Trivial Special Member Functions | P0848R3 | 10 | 19.28 (16.8)* | 6.1 | 20.11 | |||||||||
| DR: Relaxing the structured bindings customization point finding rules | P0961R1 | 8 | 8 | 19.21* |
10.0.1* |
5.1 | 20.7 | |||||||
DR: Relaxing the range-for loop customization point finding rules
|
P0962R1 | 8 | 8 | 19.25* | 5.1 | 20.7 | ||||||||
| DR: Allow structured bindings to accessible members | P0969R0 | 8 | 8 | 19.21* |
10.0.1* |
5.1 | 20.7 | |||||||
Destroying operator delete
|
P0722R3 | 9 | 6 | 19.27* |
10.0.0* |
6.1 | 20.11 | |||||||
| Class types in non-type template parameters | P0732R2 | 9 | 12 (partial) | 19.26*(partial)* 19.28 (16.9)* |
6.2 | |||||||||
Deprecate implicit capture of this via [=]
|
P0806R2 | 9 | 7 | 19.22* | 5.1 | 20.7 | ||||||||
| explicit(bool) | P0892R2 | 9 | 9 | 19.24* |
11.0.3* |
5.1 | 20.7 | |||||||
| Integrating feature-test macros | P0941R2 | 5 | 3.4 | 19.15* (partial) 19.20* |
Yes | 5.0 | 20.7 | |||||||
| Prohibit aggregates with user-declared constructors | P1008R1 | 9 | 8 | 19.20* |
10.0.1* |
5.1 | 20.7 | |||||||
constexpr virtual function
|
P1064R0 | 9 | 9 | 19.28 (16.9)* |
11.0.3* |
5.1 | 20.7 | |||||||
| Consistency improvements for comparisons | P1120R0 | 10 | 8 (partial) 10 |
19.22* |
10.0.1* (partial) |
5.1 | 20.7 | |||||||
char8_t
|
P0482R6 | 9 | 7 | 19.22* |
10.0.0* |
5.1 | 20.7 | |||||||
| std::is_constant_evaluated() | P0595R2 | 9 | 9 | 19.25* |
11.0.3* |
5.1 | 19.1 | |||||||
constexpr try-catch blocks
|
P1002R1 | 9 | 8 | 19.25* |
10.0.1* |
5.1 | 20.7 | |||||||
Immediate functions (consteval)
|
P1073R3 | 10 (partial)* 11 |
11 (partial) 14 (partial)* |
19.28 (16.8)** (partial) 19.29 (16.10)* |
5.1 | 20.7 | ||||||||
| Nested inline namespaces | P1094R2 | 9 | 8 | 19.27* |
10.0.1* |
5.1 | 20.7 | |||||||
| Yet another approach for constrained declarations | P1141R2 | 10 | 10 | 19.26* (partial) 19.28 (16.9)* |
6.1 | 20.11 | ||||||||
| Signed integers are two's complement | P1236R1 | 9 | 9 | Yes |
11.0.3* |
N/A | yes | |||||||
| dynamic_cast and polymorphic typeid in constant expressions | P1327R1 | 10 | 9 | 19.29 (16.10)* |
11.0.3* |
5.1 | 20.7 | |||||||
Changing the active member of a union inside constexpr
|
P1330R0 | 9 | 9 | 19.10* |
11.0.3* |
5.1 | 20.7 | |||||||
| Coroutines | P0912R5 | 10 | 8 (partial) | 19.0 (2015)* (partial) 19.10* (TS only) 19.28 (16.8)* |
10.0.1* (partial) |
5.1 | ||||||||
| Parenthesized initialization of aggregates | P0960R3 | 10 | 19.28 (16.8)* | 5.1 | 20.7 | |||||||||
DR: Array size deduction in new-expressions
|
P1009R2 | 11 | 9 | 19.27* |
11.0.3* |
5.1 | 20.7 | |||||||
| Modules | P1103R3 | 11 (partial) | 8 (partial) | 19.0 (2015)* (partial) 19.10* (TS only) 19.28 (16.8)* |
10.0.1* (partial) |
|||||||||
| Stronger Unicode requirements | P1041R4 P1139R2 |
10 | Yes | 19.0 (2015)* (P1041R4) 19.26* (P1139R2) |
Yes | N/A | ||||||||
<=> != ==
|
P1185R2 | 10 | 10 | 19.22* | 5.1 | 20.7 | ||||||||
| DR: Explicitly defaulted functions with different exception specifications | P1286R2 | 10 | 9 | 19.28 (16.8)* |
11.0.3* |
5.1 | 20.7 | |||||||
| Lambda capture and storage class specifiers of structured bindings | P1091R3 P1381R1 |
10 | 8 (partial) | 19.11*(P1381R1) 19.24*(P1091R3) |
10.0.1* (partial) |
5.1 | 20.7 | |||||||
| Permit conversions to arrays of unknown bound | P0388R4 | 10 | 14 | 19.27* | 6.0 | 20.11 | ||||||||
constexpr container operations
|
P0784R7 | 10 | 10 | 19.28 (16.9)* | 6.0 | 20.11 | ||||||||
Deprecating some uses of volatile
|
P1152R4 | 10 | 10 | 19.27* | 6.0 | 20.11 | ||||||||
| constinit | P1143R2 | 10 | 10 | 19.29 (16.10)* | 6.1 | 20.11 | ||||||||
| Deprecate comma operator in subscripts | P1161R3 | 10 | 9 | 19.25* |
11.0.3* |
6.0 | 20.11 | |||||||
[[nodiscard]] with message
|
P1301R4 | 10 | 9 | 19.25* |
11.0.3* |
6.0 | 20.11 | |||||||
Trivial default initialization in constexpr functions
|
P1331R2 | 10 | 10 | 19.27* | 6.1 | 20.11 | ||||||||
Unevaluated asm-declaration in constexpr functions
|
P1668R1 | 10 | 10 | 19.28 (16.9)* | 6.1 | 20.11 | ||||||||
| using enum | P1099R5 | 11 | 13 | 19.24* | 6.3 | |||||||||
| Synthesizing three-way comparison for specified comparison category | P1186R3 | 11 | 10 | 19.24* | 6.0 | 20.11 | ||||||||
DR: [[nodiscard]] for constructors
|
P1771R1 | 10 | 9 | 19.24* |
11.0.3* |
6.0 | 20.11 | |||||||
| Class template argument deduction for alias templates | P1814R0 | 10 | 19.27* | |||||||||||
| Class template argument deduction for aggregates | P1816R0 P2082R1 |
10(P1816R0) 11(P2082R1) |
19.27* | |||||||||||
| DR: Implicit move for more local objects and rvalue references | P1825R0 | 11* | 13 | 19.24* | 6.0 | 20.11 | ||||||||
| Allow defaulting comparisons by value | P1946R0 | 10 | 10 | 19.25* | 6.1 | 20.11 | ||||||||
Remove std::weak_equality and std::strong_equality
|
P1959R0 | 10 | 10 | 19.25* | 6.1 | 20.11 | ||||||||
| Inconsistencies with non-type template parameters | P1907R1 | 10 (partial) 11 |
12 (partial) | 19.26* | 6.2 | |||||||||
| DR: Pseudo-destructors end object lifetimes | P0593R6 | 11 | 11 | Yes | N/A | |||||||||
DR: Converting from T* to bool should be considered narrowing
|
P1957R2 | 10* 11* |
11 | 19.27* | 6.1 | |||||||||
| C++20 feature |
Paper(s) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
IBM XLC++ |
Sun/Oracle C++ |
Embarcadero C++ Builder |
Cray |
Nvidia HPC C++ |
Nvidia nvcc |
C++20 library features
* - hover over the version number to see notes
