Namespaces
Variants
Views
Actions

C++20

From cppreference.com
< cpp

The next major revision of the C++ standard

Following features are about to be merged into C++20:

  1. From TS's: Coroutines, Modules, Constraints and concepts, abbreviated function templates,
  2. From TS's: Ranges, uniform container erasure (std::erase/std::erase_if)

Contents

[edit] New language features

[edit] New library features

[edit] New headers

in Thread support library:

[edit] Library features

[edit] Defect reports

[edit] Compiler support

Main Article: C++ compiler support

[edit] 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
Portland Group (PGI)
Nvidia nvcc
Allow lambda-capture [=, this] P0409R2 8 6 19.22*

10.0.0*

5.1
__VA_OPT__ P0306R4
P1042R1
8 (partial)*
10 (partial)*
9 19.25*

10.0.0*

5.1
Designated initializers P0329R4 4.7 (partial)*
8
3.0 (partial)*
10
19.21* 5.1
template-parameter-list for generic lambdas P0428R2 8 9 19.22* 5.1
Default member initializers for bit-fields P0683R1 8 6 19.25*

10.0.0*

5.1
Initializer list constructors in class template argument deduction P0702R1 8 6 19.14* 5.0
const&-qualified pointers to members P0704R1 8 6 19.0*

10.0.0*

5.1
Concepts P0734R0 6
(TS only)
10
10 19.23* (partial)*
Lambdas in unevaluated contexts P0315R4 9
Three-way comparison operator P0515R3 10 8 (partial)
10
19.20* 5.1
DR: Simplifying implicit lambda capture P0588R1 8 19.24* 5.1
init-statements for range-based for P0614R1 9 8 19.25*

11.0.0*

6.0
Default constructible and assignable stateless lambdas P0624R2 9 8 19.22* 5.1
const mismatch with defaulted copy constructor P0641R2 9 8 19.21* (partial) 5.1
Access checking on specializations P0692R1 Yes 8 (partial) 5.1
ADL and function templates that are not visible P0846R0 9 9 19.21* 5.1
Less eager instantiation of constexpr functions P0859R0 5.2 (partial)*
9
Attributes [[likely]] and [[unlikely]] P0479R5 9 5.1
Make typename more optional P0634R3 9 5.1
Pack expansion in lambda init-capture P0780R2 9 9 19.22*
Attribute [[no_unique_address]] P0840R2 9 9 5.1
DR: Relaxing the structured bindings customization point finding rules P0961R1 8 8 19.21*

10.0.0*

5.1
DR: Relaxing the range-for loop customization point finding rules P0962R1 8 5.1
DR: Allow structured bindings to accessible members P0969R0 8 8 19.21*

10.0.0*

5.1
Destroying operator delete P0722R3 9 6

10.0.0*

6.1
Class types in non-type template parameters P0732R2 9
Deprecate implicit capture of this via [=] P0806R2 9 19.22* 5.1
explicit(bool) P0892R2 9 9 19.24* 5.1
Integrating feature-test macros P0941R2 5 3.4 19.15* (partial)
19.20*
5.0
Prohibit aggregates with user-declared constructors P1008R1 9 8 19.20*

10.0.0*

5.1
constexpr virtual function P1064R0 9 9 5.1
Consistency improvements for comparisons P1120R0 10 8 (partial)
10
19.22* 5.1
char8_t P0482R6 9 7 19.22* 5.1
std::is_constant_evaluated() P0595R2 9 9 19.25* 5.1 19.1
constexpr try-catch blocks P1002R1 9 8 19.25*

10.0.0*

5.1
Immediate functions P1073R3 10 (partial)* 5.1
Nested inline namespaces P1094R2 9 8 5.1
Yet another approach for constrained declarations P1141R2 10
Signed integers are two's complement P1236R1 9 9
constexpr dynamic_cast and polymorphic typeid P1327R1 10 9 5.1
Changing the active member of a union inside constexpr P1330R0 9 9 19.10* 5.1
Coroutines P0912R5 10 8 (partial) 19.25*(partial) 5.1
Parenthesized initialization of aggregates P0960R3 10 5.1
DR: Array size deduction in new-expressions P1009R2 9 5.1
Modules P1103R3 8 (partial) 19.25*(partial)
Stronger Unicode requirements P1041R4
P1139R2
10 Yes 19.0* (P1041R4) N/A
<=> != == P1185R2 10 10 19.22* 5.1
DR: Explicitly defaulted functions with different exception specifications P1286R2 10 9 5.1
Lambda capture and storage class specifiers of structured bindings P1091R3
P1381R1
10 8 (partial) 5.1
Permit conversions to arrays of unknown bound P0388R4 10 6.0
constexpr container operations P0784R7 10 10 6.0
Deprecating some uses of volatile P1152R4 10 10 6.0
constinit P1143R2 10 10
Deprecate comma operator in subscripts P1161R3 10 9 19.25* 6.0
[[nodiscard]] with message P1301R4 10 9 19.25* 6.0
Trivial default initialization in constexpr functions P1331R2 10 10 6.0
Unevaluated asm-declaration in constexpr functions P1668R1 10 10 6.1
using enum P1099R5 19.24*
Synthesizing three-way comparison for specified comparison category P1186R3 10 10 19.24* 6.0
DR: [[nodiscard]] for constructors P1771R1 10 9 19.24* 6.0
Class template argument deduction for alias templates P1814R0 10
Class template argument deduction for aggregates P1816R0 10
DR: Implicit move for more local objects and rvalue references P1825R0 19.24* 6.0
Allow defaulting comparisons by value P1946R0 10 19.25* 6.1
Remove std::weak_equality and std::strong_equality P1959R0 10
Inconsistencies with non-type template parameters P1907R1 9
DR: Converting from T* to bool should be considered narrowing P1957R2 10*
C++20 feature
 
Paper(s)
 
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
IBM XLC++
Sun/Oracle C++
Embarcadero C++ Builder
Cray
Portland Group (PGI)
Nvidia nvcc

[edit] C++20 library features

C++20 feature
 
Paper(s)
 
GCC libstdc++
Clang libc++
MSVC
Standard Library
Apple Clang
Sun/Oracle C++
Standard Library
Embarcadero C++ Builder
Standard Library
Cray C++
Standard Library
std::endian P0463R1 8 7 19.22*


Extending std::make_shared() to support arrays P0674R1
Floating point atomic P0020R6 10 19.22*


Synchronized buffered ostream P0053R7


constexpr for <algorithm> and <utility> P0202R3 10 8 (partial) 19.26*


More constexpr for <complex> P0415R1 9 7 (partial)


Make std::memory_order a scoped enumeration P0439R0 9 9 19.25*


String prefix and suffix checking P0457R2 9 6 19.21*


Library support for operator<=> <compare> P0768R1 10 7 (partial) 19.20* (partial)


std::remove_cvref P0550R2 9 6 19.20*


[[nodiscard]] in the standard library P0600R1 9 7 (partial) 19.13* (partial)
19.22*


Using std::move in numeric algorithms P0616R0 9 19.23*


Utility to convert a pointer to a raw pointer P0653R2 8 6 19.22*


Atomic std::shared_ptr and std::weak_ptr P0718R2
std::span P0122R7 10 7 19.26*


Calendar and timezone P0355R7 7 (partial)


<version> P0754R2 9 7 19.22*


Comparing unordered containers P0809R0 16.0*


ConstexprIterator requirements P0858R0 9 19.11*


std::basic_string::reserve() should not shrink P0966R1 8 19.25*
std::atomic_ref P0019R8 10


contains() member function of associative containers P0458R2 9 19.21*


DR: Guaranteed copy elision for piecewise construction P0475R1 9


std::bit_cast() P0476R2 19.27*


Integral power-of-2 operations P0556R3 P1956R1 9 (P0556R3)
10 (P1956R1)
19.25* (P0556R3)
19.27* (P1956R1)


Improving the return value of erase-like algorithms P0646R1 9 10 19.21*


std::destroying_delete P0722R3 9 9


std::is_nothrow_convertible P0758R1 9 9 19.23*


Add shift to <algorithm> P0769R2 10 19.21*


Constexpr for std::swap() and swap related functions P0879R0 10 19.26*


std::type_identity P0887R1 9 8 19.21*


Concepts library P0898R3 10 19.23*


constexpr comparison operators for std::array P1023R0 10 8 19.27*
std::unwrap_ref_decay and std::unwrap_reference P0318R1 9 8 19.21*


std::bind_front() P0356R5 9 19.25*


std::reference_wrapper for incomplete types P0357R3 9 8 19.26*


Fixing operator>>(basic_istream&, CharT*) P0487R1 8 19.23*


Library support for char8_t P0482R6 9 19.22*


Utility functions to implement uses-allocator construction P0591R4 9


DR: std::variant and std::optional should propagate copy/move triviality P0602R4 8.3 8 19.11*


A sane std::variant converting constructor P0608R3 10 9


std::function's move constructor should be noexcept P0771R1 7.2 6 19.22*


The One Ranges Proposal P0896R4 10


Heterogeneous lookup for unordered containers P0919R3 P1690R1 19.23* (P0919R3)
19.25* (P1690R1)


<chrono> zero(), min(), and max() should be noexcept P0972R0 9 8 19.14*


constexpr in std::pointer_traits P1006R1 9 8 19.26*


std::assume_aligned() P1007R3 9


Remove comparison operators of std::span P1085R2 10 8


Make stateful allocator propagation more consistent for operator+(basic_string) P1165R1 10 19.26*


Consistent container erasure P1209R0 P1115R3 9 (P1209R0)
10 (P1115R3)
8 (P1209R0) 19.25* (P1209R0)
19.27* (P1115R3)
std::lerp() and std::midpoint() P0811R3 9 9


Usability enhancements for std::span P1024R3 10 9


DR: Make create_directory() Intuitive P1164R1 8.3 19.20*


std::ssize() and unsigned extent for std::span P1227R2 10 9 19.25*


Traits for (un)bounded arrays P1357R1 9 9 19.25*
std::to_array() P0325R4 10 10 19.25*


Efficient access to std::basic_stringbuf’s Buffer P0408R7


Layout-compatibility and pointer-interconvertibility traits P0466R5


Bit operations P0553R4 9 9 19.25*


Mathematical constants P0631R8 10 19.25*


Text formatting P0645R10


std::stop_token and std::jthread P0660R10 10


constexpr std::allocator and related utilities P0784R7 10


constexpr std::string P0980R1


constexpr std::vector P1004R2


Input range adaptors P1035R7 10


constexpr std::invoke() and related utilities P1065R2 10


Atomic waiting and notifying, std::counting_semaphore, std::latch and std::barrier P1135R6


std::source_location P1208R6 7 (TS only)


Adding <=> to the standard library P1614R2 10 (partial)
constexpr default constructor of std::atomic and std::atomic_flag P0883R2 19.26*
constexpr for numeric algorithms P1645R1 10 19.26*
Safe integral comparisons P0586R2 10
C++20 feature
 
Paper(s)
 
GCC libstdc++
Clang libc++
MSVC
Standard Library
Apple Clang
Sun/Oracle C++
Standard Library
Embarcadero C++ Builder
Standard Library
Cray C++
Standard Library

* - hover over the version number to see notes