Namespaces
Variants
Actions

Compiler support for C++20

From cppreference.com

* - 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.

[edit]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]P0409R28 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)*P0329R44.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)*P0428R28 9 19.22*11.0.0*5.1 2021.1 20.7 12.0 11.0
Default member initializers for bit-fieldsP0683R18 6 19.25*10.0.0*5.1 2021.1 20.7 12.0 11.0
Initializer list constructors in class template argument deduction P0702R18 6 19.14*Yes 5.0 2021.1 20.7 12.0 11.0
const&-qualified pointers to members P0704R18 6 19.0 (2015)*10.0.0*5.1 2021.1 20.7 12.0 11.0
Concepts  (FTM)*P0734R05*
10
10 19.23*(partial)*
19.30*
12.0.0* (partial) 6.1 2023.1*20.11 12.0 11.0
Lambdas in unevaluated contextsP0315R49 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)*P0515R310 8 (partial)
10
19.20*12.0.0*5.1 2021.1 20.7 12.0 11.0
DR11: Simplifying implicit lambda capture P0588R18 19.24*5.1 2021.1 20.7 12.0
init-statements for range-based forP0614R19 8 19.25*11.0.0*6.0 2021.7 20.11 12.0 11.0
Default constructible and assignable stateless lambdasP0624R29 8 19.22*10.0.1*5.1 2021.1 20.7 12.0 11.0
Type mismatch of defaulted special member functions P0641R29 (partial)*8 19.0 (2015)*(partial)*10.0.1*5.1 2021.1 20.7 12.0 11.0
Access checking on specializations P0692R1Yes 8 (partial)
14
19.26*14.0.0*5.1 2021.1 20.7 12.0
ADL and function templates that are not visible P0846R09 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)*P0859R05.2 (partial)*
9
8 19.27* (partial)*
19.31**
11.0.0*(partial) 12.0 11.0
Attributes [[likely]] and [[unlikely]]P0479R59 12 19.26*13.0.0*5.1 2021.7 20.7 12.0
Make typename more optional P0634R39 16 19.29 (16.10)*16.0.0*5.1 2023.1 20.7 12.0
Pack-expansions in lambda init-captures  (FTM)*P0780R29 9 19.22*11.0.3*6.1 2021.7 20.11 12.0 11.0
Attribute [[no_unique_address]]P0840R29 9 19.28 (16.9)**11.0.3*5.1 2021.1 20.7 12.0 11.0
Conditionally trivial special member functions  (FTM)*P0848R310 16 19.28 (16.8)*6.1 2021.7 20.11 12.0
DR17: Relaxing the structured bindings customization point finding rules P0961R18 8 19.20*10.0.1*5.1 2021.1 20.7 12.0 11.0
DR11: Relaxing the range-for loop customization point finding rules P0962R18 8 19.25*11.0.0*5.1 2021.1 20.7 12.0 11.0
DR17: Allow structured bindings to accessible members P0969R08 8 19.20*10.0.1*5.1 2021.1 20.7 12.0 11.0
Destroying operator delete  (FTM)*P0722R39 6 19.27*10.0.0*6.1 2023.1 20.11 12.0 11.0
Class types in Constant template parametersP0732R29 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 [=]P0806R29 7 19.22*10.0.1*5.1 20.7 12.0 11.0
explicit(bool)  (FTM)*P0892R29 9 19.24*11.0.3*5.1 2021.1 20.7 12.0 11.0
Integrating feature-test macrosP0941R25 3.4 19.15* (partial)
19.20*
Yes 5.0 2021.1 20.7 12.0 11.0
Prohibit aggregates with user-declared constructors P1008R19 8 19.20*10.0.1*5.1 2021.1 20.7 12.0 11.0
constexprvirtual function  (FTM)*P1064R09 9 19.28 (16.9)*11.0.3*5.1 2021.1 20.7 12.0 11.0
Consistency improvements for comparisons P1120R010 8 (partial)
10
19.22*12.0.0*5.1 2023.1 20.7 12.0 11.0
char8_t  (FTM)*P0482R69 7*19.22*10.0.0*5.1 2021.1 20.7 12.0 11.0
std::is_constant_evaluated()  (FTM)*P0595R29 9 19.25*11.0.3*5.1 19.1 21.1 12.0 11.0
constexprtry-catch blocks P1002R19 8 19.25*10.0.1*5.1 2023.1 20.7 12.0 11.0
Immediate functions (consteval)  (FTM)*P1073R310 (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 namespacesP1094R29 8 19.27*10.0.1*5.1 2021.1 20.7 12.0 11.0
Yet another approach for constraineddeclarationsP1141R210 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 P1236R19 9 Yes 11.0.3*N/A2023.1*yes*12.0 11.0
dynamic_cast and polymorphic typeid in constant expressionsP1327R110 9 19.28 (16.9)*11.0.3*5.1 2021.1 20.7 12.0 11.0
Changing the active member of a union inside constexpr  (FTM)*P1330R09 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)*P0960R310 16 19.28 (16.8)*16.0.0*5.1 2021.1 20.7 12.0
DR11: Array size deduction in new-expressionsP1009R211 9 19.27*11.0.3*5.1 2021.1 20.7 12.0 11.0
Modules  (FTM)*P1103R311 (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/A2023.1*Yes 12.0 11.0
<=> != ==P1185R210 10 19.22*12.0.0*5.1 2021.1 20.7 12.0 11.0
DR11: Explicitly defaulted functions with different exception specifications P1286R210 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 P0388R410 14 19.27*14.0.0*6.0 2021.5 20.11 12.0
constexpr container operations  (FTM)*P0784R710 10 19.28 (16.9)*12.0.0*6.0 2021.5 20.11 12.0 11.0
Deprecating some uses of volatileP1152R410 10 19.27*12.0.0*6.0 2021.5 20.11 12.0 11.0
constinit  (FTM)*P1143R210 10 19.29 (16.10)*12.0.0*6.1 2021.7 20.11 12.0 11.0
Deprecate comma operator in subscriptsP1161R310 9 19.25*11.0.3*6.0 2021.7 20.11 12.0 11.0
[[nodiscard]] with message P1301R410 9 19.25*11.0.3*6.0 2021.5 20.11 12.0 11.0
Trivial default initialization in constexpr functions P1331R210 10 19.27*12.0.0*6.1 2021.7 20.11 12.0 11.0
Unevaluated asm-declaration in constexpr functions P1668R110 10 19.28 (16.9)*12.0.0*6.1 2021.7 20.11 12.0 11.0
using enum  (FTM)*P1099R511 13 19.24*13.1.6*6.3 2023.1 22.5 12.0
Synthesizing Three-way comparison for specified comparison category P1186R311 10 19.24*12.0.0*6.0 2021.5 20.11 12.0 11.0
DR17: [[nodiscard]] for constructors P1771R110 9 19.24*11.0.3*6.0 2021.5 20.11 12.0 11.0
class template argument deduction for alias templates  (FTM)*P1814R010 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 P1825R011*13 19.24*13.1.6*6.0 2021.5 20.11 12.0
Allow defaulting comparisons by value P1946R010 10 19.25*12.0.0*6.1 2021.7 20.11 12.0 11.0
Remove std::weak_equality and std::strong_equalityP1959R010 10 19.25*12.0.0*6.1 2021.7 20.11 12.0 11.0
Inconsistencies with constant template parameters  (FTM)*P1907R110 (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 P0593R611 11 Yes 12.0.5*N/A2023.1*Yes 12.0 11.0
DR11: Converting from T* to bool should be considered narrowing P1957R210*
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

[edit]C++20 library features

C++20 feature

 
Paper(s)

 
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
std::endian  (FTM)*P0463R18 7 19.22*10.0.0*
Extending std::make_shared() to support arrays  (FTM)*P0674R112 15 19.27*14.0.3*
Floating-point atomic  (FTM)*P0020R610 18 19.22*16.0.0*
Synchronized buffered (std::basic_osyncstream)  (FTM)*P0053R711 18 19.29 (16.10)*
constexpr for <algorithm> and <utility>  (FTM)*P0202R310 8 (partial)
12
19.26*10.0.1* (partial)
13.0.0*
More constexpr for <complex>  (FTM)*P0415R19 7 (partial)
16
19.27*10.0.0* (partial)
15.0.0*
Make std::memory_order a scoped enumeration P0439R09 9 19.25*11.0.3*
Stringprefix and suffix checking: string(_view) ::starts_with / ends_with  (FTM)*P0457R29 6 19.21*10.0.0*
Library support for operator<=><compare>  (FTM)*P0768R110 7 (partial)
12 (partial)*
17
19.20* (partial)
19.28 (16.9)*
13.0.0*
std::remove_cvref  (FTM)*P0550R29 6 19.20*10.0.0*
[[nodiscard]] in the standard libraryP0600R19 7 (partial)
16
19.13* (partial)
19.22*
10.0.0* (partial)
15.0.0*
Using std::move in numeric algorithmsP0616R09 12 19.23*13.0.0*
Utility to convert a pointer to a raw pointer  (FTM)*P0653R28 6 19.22*Yes
Atomic std::shared_ptr and std::weak_ptr  (FTM)*P0718R212 19.27*
std::span  (FTM)*P0122R710 7 19.26*10.0.0*
Calendar and Time zone  (FTM)*P0355R711 (partial)*
13 (partial)*
14
7 (partial)
19 (partial)*
19.29 (16.10)*10.0.0* (partial)
<version>P0754R29 7 19.22*10.0.0*
Comparing unordered containers P0809R0Yes Yes 16.0*Yes
ConstexprIterator requirements  (FTM)*  (FTM)*P0858R09 12 19.11*13.0.0*
std::basic_string::reserve() should not shrink P0966R111 8 19.25*10.0.1*
Atomic Compare-And-Exchange with padding bits P0528R313 19.28 (16.8)*
std::atomic_ref  (FTM)*P0019R810 19 19.28 (16.8)*
contains() member function of associative containers, e.g. std::map::contains()P0458R29 13 19.21*13.1.6*
DR11: Guaranteed copy elision for piecewise constructionP0475R19 Yes 19.29 (16.10)*Yes
std::bit_cast()  (FTM)*P0476R211 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)*P0646R19 10 19.21*12.0.0*
std::destroying_delete_t  (FTM)*P0722R39 9 19.27*11.0.3*
std::is_convertible  (FTM)*P0758R19 9 19.23*11.0.3*
Add std::shift_left/right to <algorithm>  (FTM)*P0769R210 12 19.21*13.0.0*
Constexpr for std::swap() and swap related functions P0879R010 13 19.26*13.1.6*
std::type_identity  (FTM)*P0887R19 8 19.21*10.0.1*
Concepts library  (FTM)*P0898R310 13 19.23*13.1.6*
constexprcomparison operators for std::arrayP1023R010 8 19.27*10.0.1*
std::unwrap_ref_decay and std::unwrap_reference  (FTM)*P0318R19 8 19.21*10.0.1*
std::bind_front()  (FTM)*P0356R59 13 19.25*13.1.6*
std::reference_wrapper for incomplete types P0357R39 8 19.26*10.0.1*
Fixing operator>>(basic_istream&, CharT*)P0487R111 8 19.23*10.0.1*
Library support for char8_t  (FTM)*P0482R69 8 (partial)
16
19.22*10.0.1* (partial)
15.0.0*
Utility functions to implement uses-allocatorconstructionP0591R49 16 19.29 (16.10)*15.0.0*
DR17: std::variant and std::optional should propagate copy/move triviality P0602R48.3 8 19.11*10.0.1*
DR17: A sane std::variant converting constructor P0608R310 9 19.29 (16.10)**
19.42**
11.0.3*
std::function's move constructor should be noexceptP0771R17.2 6 19.22*Yes
The OneRangesProposal  (FTM)*P0896R410 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 noexceptP0972R09 8 19.14*10.0.1*
constexpr in std::pointer_traits  (FTM)*P1006R19 8 19.26*10.0.1*
std::assume_aligned()  (FTM)*P1007R39*
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)*P1032R110 13 19.28 (16.8)*13.1.6*
Remove comparison operators of std::spanP1085R210 8 19.26*10.0.1*
Make stateful allocator propagation more consistent for operator+(basic_string)P1165R110 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 P1502R111 19.29 (16.10)*
polymorphic_allocator<> as a vocabulary type  (FTM)*P0339R69 16 19.28 (16.9)*15.0.0*
std::execution::unseq  (FTM)*P1001R29 17 19.28 (16.8)*
std::lerp() and std::midpoint()  (FTM)*P0811R39 9 19.23* (partial)
19.28 (16.8)*
11.0.3*
Usability enhancements for std::spanP1024R310 9*
14
19.26*11.0.3*
DR17: Make std::create_directory() intuitive P1164R18.3 12 19.20*13.0.0*
std::ssize() and unsigned extent for std::span  (FTM)*P1227R210 9 19.25*11.0.3*
Traits for (un)bounded arrays  (FTM)*P1357R19 9 19.25*11.0.3*
std::to_array()  (FTM)*P0325R410 10 19.25*12.0.0*
Efficient access to std::basic_stringbuf’s buffer P0408R711 17 19.29 (16.10)*15.0.0*
Layout-compatibility and pointer-interconvertibility traits  (FTM)*  (FTM)*P0466R512 19.29 (16.10)**
Bit operations: std::

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

P0553R49 9 19.25**
19.28 (16.8)*
11.0.3*
Mathematical constants  (FTM)*P0631R810 11 19.25*12.0.5*
Text formatting  (FTM)*P0645R1013 14**
17
19.29 (16.10)*15.0.0*
std::stop_token and std::jthread  (FTM)*P0660R1010 17
(partial)*

20*
19.28 (16.9)*
constexprstd::allocator and related utilities  (FTM)*P0784R710 12 19.29 (16.10)*13.0.0*
constexprstd::string  (FTM)*P0426R1
P1032R1
P0980R1
12 15 19.29 (16.10)*
19.30**
14.0.3*
constexprstd::vector  (FTM)*P1004R212 15 19.29 (16.10)*
19.30**
14.0.3*
Input range adaptorsP1035R710 16 19.29 (16.10)*15.0.0*
constexprstd::invoke() and related utilities P1065R210 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)*P1135R611 11 19.28 (16.9)*13.1.6*
std::source_location  (FTM)*P1208R611 15*
(partial)
16
19.29 (16.10)*15.0.0*
Adding <=> to the standard library P1614R210 14*
(partial)
17*
(partial)
19
19.29 (16.10)*13.1.6* (partial)
constexpr default constructor of std::atomic and std::atomic_flag  (FTM)*P0883R210 13 19.26*13.1.6*
constexpr for numeric algorithms  (FTM)*P1645R110 12 19.26*13.0.0*
Safe integral comparisons  (FTM)*P0586R210 13 19.27*13.1.6*
 

C++20 feature
 

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