C++20

From cppreference.com
< cpp

C++20 is a major version after C++17, featuring major features (concepts, modules, coroutines, and ranges) and other language and library features. The standard was published in December 2020.

New language features

New library features

New headers

in Thread support library:

Library features

Defect reports

Defect Reports fixed in C++20 (158 core, 345 library)

Compiler support

Main Article: C++20 compiler support

C++20 core language features

C++20 feature

 
Paper(s)

 
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
Allow Lambda capture [=, this] P0409R2 8 6 19.22* 10.0.0* 5.1 2021.1 20.7 12.0 11.0
__VA_OPT__ P0306R4
P1042R1
8 (partial)*
10 (partial)*
12
9 19.25* 11.0.3* 5.1 2021.1 20.7 12.0 11.0
Designated initializers  (FTM)* P0329R4 4.7 (partial)*
8
3.0 (partial)*
10
19.21* 12.0.0* 5.1 2021.1 20.7 12.0 11.0
template-parameter-list for generic lambdas  (FTM)* P0428R2 8 9 19.22* 11.0.0* 5.1 2021.1 20.7 12.0 11.0
Default member initializers for bit-fields P0683R1 8 6 19.25* 10.0.0* 5.1 2021.1 20.7 12.0 11.0
Initializer list constructors in class template argument deduction P0702R1 8 6 19.14* Yes 5.0 2021.1 20.7 12.0 11.0
const&-qualified pointers to members P0704R1 8 6 19.0 (2015)* 10.0.0* 5.1 2021.1 20.7 12.0 11.0
Concepts  (FTM)* P0734R0 5*
10
10 19.23* (partial)*
19.30*
12.0.0* (partial) 6.1 2023.1* 20.11 12.0 11.0
Lambdas in unevaluated contexts P0315R4 9 13 (partial)*
14 (partial)*
17
19.28 (16.8)* 13.1.6* (partial) 6.2 2023.1 (partial)
2024.0
20.7 12.0
Three-way comparison operator  (FTM)* P0515R3 10 8 (partial)
10
19.20* 12.0.0* 5.1 2021.1 20.7 12.0 11.0
DR11: Simplifying implicit lambda capture P0588R1 8 19.24* 5.1 2021.1 20.7 12.0
init-statements for range-based for P0614R1 9 8 19.25* 11.0.0* 6.0 2021.7 20.11 12.0 11.0
Default constructible and assignable stateless lambdas P0624R2 9 8 19.22* 10.0.1* 5.1 2021.1 20.7 12.0 11.0
Type mismatch of defaulted special member functions P0641R2 9 (partial)* 8 19.0 (2015)* (partial)* 10.0.1* 5.1 2021.1 20.7 12.0 11.0
Access checking on specializations P0692R1 Yes 8 (partial)
14
19.26* 14.0.0* 5.1 2021.1 20.7 12.0
ADL and function templates that are not visible P0846R0 9 9 19.21* 11.0.3* 5.1 2021.1 20.7 12.0 11.0
DR11: Specify when constexpr function definitions are needed for constant evaluation  (FTM)* P0859R0 5.2 (partial)*
9
8 19.27* (partial)*
19.31**
11.0.0* (partial) 12.0 11.0
Attributes [[likely]] and [[unlikely]] P0479R5 9 12 19.26* 13.0.0* 5.1 2021.7 20.7 12.0
Make typename more optional P0634R3 9 16 19.29 (16.10)* 16.0.0* 5.1 2023.1 20.7 12.0
Pack-expansions in lambda init-captures  (FTM)* P0780R2 9 9 19.22* 11.0.3* 6.1 2021.7 20.11 12.0 11.0
Attribute [[no_unique_address]] P0840R2 9 9 19.28 (16.9)** 11.0.3* 5.1 2021.1 20.7 12.0 11.0
Conditionally trivial special member functions  (FTM)* P0848R3 10 16 19.28 (16.8)* 6.1 2021.7 20.11 12.0
DR17: Relaxing the structured bindings customization point finding rules P0961R1 8 8 19.21* 10.0.1* 5.1 2021.1 20.7 12.0 11.0
DR11: Relaxing the range-for loop customization point finding rules P0962R1 8 8 19.25* 11.0.0* 5.1 2021.1 20.7 12.0 11.0
DR17: Allow structured bindings to accessible members P0969R0 8 8 19.21* 10.0.1* 5.1 2021.1 20.7 12.0 11.0
Destroying operator delete  (FTM)* P0722R3 9 6 19.27* 10.0.0* 6.1 2023.1 20.11 12.0 11.0
Class types in Non-type template parameters P0732R2 9 12 (partial) 19.26*(partial)*
19.28 (16.9)*
13.0.0* (partial) 6.2 2023.1 (partial) 21.3 12.0
Deprecate implicit capture of this via [=] P0806R2 9 7 19.22* 10.0.1* 5.1 20.7 12.0 11.0
explicit(bool)  (FTM)* P0892R2 9 9 19.24* 11.0.3* 5.1 2021.1 20.7 12.0 11.0
Integrating feature-test macros P0941R2 5 3.4 19.15* (partial)
19.20*
Yes 5.0 2021.1 20.7 12.0 11.0
Prohibit aggregates with user-declared constructors P1008R1 9 8 19.20* 10.0.1* 5.1 2021.1 20.7 12.0 11.0
constexpr virtual function  (FTM)* P1064R0 9 9 19.28 (16.9)* 11.0.3* 5.1 2021.1 20.7 12.0 11.0
Consistency improvements for comparisons P1120R0 10 8 (partial)
10
19.22* 12.0.0* 5.1 2023.1 20.7 12.0 11.0
char8_t  (FTM)* P0482R6 9 7* 19.22* 10.0.0* 5.1 2021.1 20.7 12.0 11.0
std::is_constant_evaluated()  (FTM)* P0595R2 9 9 19.25* 11.0.3* 5.1 19.1 21.1 12.0 11.0
constexpr try-catch blocks P1002R1 9 8 19.25* 10.0.1* 5.1 2023.1 20.7 12.0 11.0
Immediate functions (consteval)  (FTM)* P1073R3 10 (partial)*
11
11 (partial)
14 (partial)*
17
19.28 (16.8)*
(partial)*

19.29 (16.10)*
11.0.3* (partial)
15.0.0*
5.1 2021.1 20.7 12.0
Nested inline namespaces P1094R2 9 8 19.27* 10.0.1* 5.1 2021.1 20.7 12.0 11.0
Yet another approach for constrained declarations P1141R2 10 10 19.26* (partial)
19.28 (16.9)*
12.0.5* 6.1 2023.1 20.11 12.0 11.0
Signed integers are two's complement P1236R1 9 9 Yes 11.0.3* N/A 2023.1* yes* 12.0 11.0
dynamic_cast and polymorphic typeid in constant expressions P1327R1 10 9 19.29 (16.10)* 11.0.3* 5.1 2021.1 20.7 12.0 11.0
Changing the active member of a union inside constexpr  (FTM)* P1330R0 9 9 19.10* 11.0.3* 5.1 2021.1 20.7 12.0 11.0
Coroutines  (FTM)*  (FTM)* P0912R5
LWG3393
10 8 (partial)
17 (partial)*
19.0 (2015)* (partial)
19.10**
19.28 (16.8)*
10.0.1* (partial) 5.1 2021.1 23.3* 12.0 (host code only)
Parenthesized initialization of aggregates  (FTM)* P0960R3 10 16 19.28 (16.8)* 16.0.0* 5.1 2021.1 20.7 12.0
DR11: Array size deduction in new-expressions P1009R2 11 9 19.27* 11.0.3* 5.1 2021.1 20.7 12.0 11.0
Modules  (FTM)* P1103R3 11 (partial) 8 (partial) 19.0 (2015)* (partial)
19.10**
19.28 (16.8)*
10.0.1* (partial) 2023.1 (partial)
Stronger Unicode requirements P1041R4
P1139R2
10 Yes 19.0 (2015)**
19.26**
Yes N/A 2023.1* Yes 12.0 11.0
<=> != == P1185R2 10 10 19.22* 12.0.0* 5.1 2021.1 20.7 12.0 11.0
DR11: Explicitly defaulted functions with different exception specifications P1286R2 10 9 19.28 (16.8)* 11.0.3* 5.1 2021.1 20.7 12.0 11.0
Lambda capture and storage class specifiers of structured bindings P1091R3
P1381R1
10 8 (partial)
16
19.11**
19.24**
16.0.0* 5.1 2021.1 20.7 12.0
Permit conversions to arrays of unknown bound P0388R4 10 14 19.27* 14.0.0* 6.0 2021.5 20.11 12.0
constexpr container operations  (FTM)* P0784R7 10 10 19.28 (16.9)* 12.0.0* 6.0 2021.5 20.11 12.0 11.0
Deprecating some uses of volatile P1152R4 10 10 19.27* 12.0.0* 6.0 2021.5 20.11 12.0 11.0
constinit  (FTM)* P1143R2 10 10 19.29 (16.10)* 12.0.0* 6.1 2021.7 20.11 12.0 11.0
Deprecate comma operator in subscripts P1161R3 10 9 19.25* 11.0.3* 6.0 2021.7 20.11 12.0 11.0
[[nodiscard]] with message P1301R4 10 9 19.25* 11.0.3* 6.0 2021.5 20.11 12.0 11.0
Trivial default initialization in constexpr functions P1331R2 10 10 19.27* 12.0.0* 6.1 2021.7 20.11 12.0 11.0
Unevaluated asm-declaration in constexpr functions P1668R1 10 10 19.28 (16.9)* 12.0.0* 6.1 2021.7 20.11 12.0 11.0
using enum  (FTM)* P1099R5 11 13 19.24* 13.1.6* 6.3 2023.1 22.5 12.0
Synthesizing Three-way comparison for specified comparison category P1186R3 11 10 19.24* 12.0.0* 6.0 2021.5 20.11 12.0 11.0
DR17: [[nodiscard]] for constructors P1771R1 10 9 19.24* 11.0.3* 6.0 2021.5 20.11 12.0 11.0
class template argument deduction for alias templates  (FTM)* P1814R0 10 19 19.27* 6.5 23.9 12.0
class template argument deduction for aggregates  (FTM)* P1816R0
P2082R1
10*
11*
17 19.27* 6.3 2023.1 (partial)*
2024.1
23.3 12.0
DR11: Implicit move for more local objects and rvalue references P1825R0 11* 13 19.24* 13.1.6* 6.0 2021.5 20.11 12.0
Allow defaulting comparisons by value P1946R0 10 10 19.25* 12.0.0* 6.1 2021.7 20.11 12.0 11.0
Remove std::weak_equality and std::strong_equality P1959R0 10 10 19.25* 12.0.0* 6.1 2021.7 20.11 12.0 11.0
Inconsistencies with non-type template parameters  (FTM)* P1907R1 10 (partial)
11
18 (partial)* 19.26* 13.1.6* (partial) 6.2 2023.1 (partial) 21.3 12.0
DR98: Pseudo-destructors end object lifetimes P0593R6 11 11 Yes 12.0.5* N/A 2023.1* Yes 12.0 11.0
DR11: Converting from T* to bool should be considered narrowing P1957R2 10*
11*
11 19.27* 12.0.5* 6.1 12.0 11.0
 

C++20 feature
 

Paper(s)
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray

C++20 library features

C++20 feature

 
Paper(s)

 
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
std::endian  (FTM)* P0463R1 8 7 19.22* 10.0.0*
Extending std::make_shared() to support arrays  (FTM)* P0674R1 12 15 19.27* 14.0.3*
Floating-point atomic  (FTM)* P0020R6 10 18 19.22* 16.0.0*
Synchronized buffered (std::basic_osyncstream)  (FTM)* P0053R7 11 18 19.29 (16.10)*
constexpr for <algorithm> and <utility>  (FTM)* P0202R3 10 8 (partial)
12
19.26* 10.0.1* (partial)
13.0.0*
More constexpr for <complex>  (FTM)* P0415R1 9 7 (partial)
16
19.27* 10.0.0* (partial)
15.0.0*
Make std::memory_order a scoped enumeration P0439R0 9 9 19.25* 11.0.3*
String prefix and suffix checking: string(_view) ::starts_with / ends_with  (FTM)* P0457R2 9 6 19.21* 10.0.0*
Library support for operator<=> <compare>  (FTM)* P0768R1 10 7 (partial)
12 (partial)*
17
19.20* (partial)
19.28 (16.9)*
13.0.0*
std::remove_cvref  (FTM)* P0550R2 9 6 19.20* 10.0.0*
[[nodiscard]] in the standard library P0600R1 9 7 (partial)
16
19.13* (partial)
19.22*
10.0.0* (partial)
15.0.0*
Using std::move in numeric algorithms P0616R0 9 12 19.23* 13.0.0*
Utility to convert a pointer to a raw pointer  (FTM)* P0653R2 8 6 19.22* Yes
Atomic std::shared_ptr and std::weak_ptr  (FTM)* P0718R2 12 19.27*
std::span  (FTM)* P0122R7 10 7 19.26* 10.0.0*
Calendar and Time zone  (FTM)* P0355R7 11 (partial)*
13 (partial)*
14
7 (partial)
19 (partial)*
19.29 (16.10)* 10.0.0* (partial)
<version> P0754R2 9 7 19.22* 10.0.0*
Comparing unordered containers P0809R0 Yes Yes 16.0* Yes
ConstexprIterator requirements  (FTM)*  (FTM)* P0858R0 9 12 19.11* 13.0.0*
std::basic_string::reserve() should not shrink P0966R1 11 8 19.25* 10.0.1*
Atomic Compare-And-Exchange with padding bits P0528R3 13 19.28 (16.8)*
std::atomic_ref  (FTM)* P0019R8 10 19 19.28 (16.8)*
contains() member function of associative containers, e.g. std::map::contains() P0458R2 9 13 19.21* 13.1.6*
DR11: Guaranteed copy elision for piecewise construction P0475R1 9 Yes 19.29 (16.10)* Yes
std::bit_cast()  (FTM)* P0476R2 11 14 19.27* 14.0.3*
Integral power-of-2 operations:

std::bit_ceil(), std::bit_floor(), std::bit_width(), std::has_single_bit()  (FTM)*

P0556R3
P1956R1
9*
10*
9*
12*
19.25**
19.27**
19.28 (16.8)*
11.0.3**
13.0.0**
Improving the return value of erase-like algorithms  (FTM)* P0646R1 9 10 19.21* 12.0.0*
std::destroying_delete_t  (FTM)* P0722R3 9 9 19.27* 11.0.3*
std::is_convertible  (FTM)* P0758R1 9 9 19.23* 11.0.3*
Add std::shift_left/right to <algorithm>  (FTM)* P0769R2 10 12 19.21* 13.0.0*
Constexpr for std::swap() and swap related functions P0879R0 10 13 19.26* 13.1.6*
std::type_identity  (FTM)* P0887R1 9 8 19.21* 10.0.1*
Concepts library  (FTM)* P0898R3 10 13 19.23* 13.1.6*
constexpr comparison operators for std::array P1023R0 10 8 19.27* 10.0.1*
std::unwrap_ref_decay and std::unwrap_reference  (FTM)* P0318R1 9 8 19.21* 10.0.1*
std::bind_front()  (FTM)* P0356R5 9 13 19.25* 13.1.6*
std::reference_wrapper for incomplete types P0357R3 9 8 19.26* 10.0.1*
Fixing operator>>(basic_istream&, CharT*) P0487R1 11 8 19.23* 10.0.1*
Library support for char8_t  (FTM)* P0482R6 9 8 (partial)
16
19.22* 10.0.1* (partial)
15.0.0*
Utility functions to implement uses-allocator construction P0591R4 9 16 19.29 (16.10)* 15.0.0*
DR17: std::variant and std::optional should propagate copy/move triviality P0602R4 8.3 8 19.11* 10.0.1*
DR17: A sane std::variant converting constructor P0608R3 10 9 19.29 (16.10)**
19.42**
11.0.3*
std::function's move constructor should be noexcept P0771R1 7.2 6 19.22* Yes
The One Ranges Proposal  (FTM)* P0896R4 10 13 (partial)
15*
19.29 (16.10)* 14.0.3*
Heterogeneous lookup for unordered associative containers  (FTM)* P0919R3
P1690R1
11 12 19.23* (P0919R3)
19.25* (P1690R1)
13.0.0*
<chrono> zero(), min(), and max() should be noexcept P0972R0 9 8 19.14* 10.0.1*
constexpr in std::pointer_traits  (FTM)* P1006R1 9 8 19.26* 10.0.1*
std::assume_aligned()  (FTM)* P1007R3 9*
11
15 19.28 (16.9)* 14.0.3*
Smart pointer creation with default initialization (e.g. make_unique_for_overwrite)  (FTM)* P1020R1
P1973R1
11*
12*
16 19.28 (16.9)* 15.0.0*
Misc constexpr bits  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)* P1032R1 10 13 19.28 (16.8)* 13.1.6*
Remove comparison operators of std::span P1085R2 10 8 19.26* 10.0.1*
Make stateful allocator propagation more consistent for operator+(basic_string) P1165R1 10 15 19.26* 14.0.3*
Consistent container erasure, e.g. std::erase(std::vector), or std::erase_if(std::map)  (FTM)* P1209R0
P1115R3
9*
10*
8*
11*
19.25**
19.27**
10.0.1**
12.0.5**
Standard library header units P1502R1 11 19.29 (16.10)*
polymorphic_allocator<> as a vocabulary type  (FTM)* P0339R6 9 16 19.28 (16.9)* 15.0.0*
std::execution::unseq  (FTM)* P1001R2 9 17 19.28 (16.8)*
std::lerp() and std::midpoint()  (FTM)* P0811R3 9 9 19.23* (partial)
19.28 (16.8)*
11.0.3*
Usability enhancements for std::span P1024R3 10 9*
14
19.26* 11.0.3*
DR17: Make std::create_directory() intuitive P1164R1 8.3 12 19.20* 13.0.0*
std::ssize() and unsigned extent for std::span  (FTM)* P1227R2 10 9 19.25* 11.0.3*
Traits for (un)bounded arrays  (FTM)* P1357R1 9 9 19.25* 11.0.3*
std::to_array()  (FTM)* P0325R4 10 10 19.25* 12.0.0*
Efficient access to std::basic_stringbuf’s buffer P0408R7 11 17 19.29 (16.10)* 15.0.0*
Layout-compatibility and pointer-interconvertibility traits  (FTM)*  (FTM)* P0466R5 12 19.29 (16.10)**
Bit operations: std::

rotl(), rotr(), countl_zero(), countl_one(), countr_zero(), countr_one(), popcount()  (FTM)*

P0553R4 9 9 19.25**
19.28 (16.8)*
11.0.3*
Mathematical constants  (FTM)* P0631R8 10 11 19.25* 12.0.5*
Text formatting  (FTM)* P0645R10 13 14**
17
19.29 (16.10)* 15.0.0*
std::stop_token and std::jthread  (FTM)* P0660R10 10 17
(partial)*

20*
19.28 (16.9)*
constexpr std::allocator and related utilities  (FTM)* P0784R7 10 12 19.29 (16.10)* 13.0.0*
constexpr std::string  (FTM)* P0426R1
P1032R1
P0980R1
12 15 19.29 (16.10)*
19.30**
14.0.3*
constexpr std::vector  (FTM)* P1004R2 12 15 19.29 (16.10)*
19.30**
14.0.3*
Input range adaptors P1035R7 10 16 19.29 (16.10)* 15.0.0*
constexpr std::invoke() and related utilities P1065R2 10 12 19.28 (16.8)* 13.0.0*
Atomic waiting and notifying, std::counting_semaphore, std::latch and std::barrier  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)* P1135R6 11 11 19.28 (16.8)* 13.1.6*
std::source_location  (FTM)* P1208R6 11 15*
(partial)
16
19.29 (16.10)* 15.0.0*
Adding <=> to the standard library P1614R2 10 14*
(partial)
17*
(partial)
19
19.29 (16.10)* 13.1.6* (partial)
constexpr default constructor of std::atomic and std::atomic_flag  (FTM)* P0883R2 10 13 19.26* 13.1.6*
constexpr for numeric algorithms  (FTM)* P1645R1 10 12 19.26* 13.0.0*
Safe integral comparisons  (FTM)* P0586R2 10 13 19.27* 13.1.6*
 

C++20 feature
 

Paper(s)
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*

* - hover over a cell marked with the star * to see additional pop-up notes.
DRnn - the number nn after "DR" denotes target C++ revision the Defect Report is applied to, e.g., DR20 → C++20.

External links

1.  C++20 - Wikipedia
2.  Working C++20 examples