Compiler support for C++20 - cppreference.com

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.

C++20 core language features

C++20 featurePaper(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.20*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.20*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 constexprtry-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/A2023.1*yes*12.0 11.0

dynamic_cast

and polymorphic

typeid

in

constant expressions

P1327R1

10 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

)*

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/A2023.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/A2023.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 featurePaper(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)*16.0.0*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 (partial)*19.21*13.0.0*(partial)*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.9)*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*