C++20
2020 edition of the C++ programming language standard From Wikipedia, the free encyclopedia
C++20 is a version of the ISO/IEC 14882 standard for the C++ programming language. C++20 replaced the prior version of the C++ standard, called C++17, and was later replaced by C++23.[1] The standard was technically finalized[2] by WG21 at the meeting in Prague in February 2020,[3] had its final draft version announced in March 2020,[4] was approved on 4 September 2020,[5][6] and published in December 2020.[7]
Features
Summarize
Perspective
C++20 adds more new major features than C++14 or C++17.[8] Changes that have been accepted into C++20 include:[9]
Language
- concepts,[10] with terse syntax[11]
- modules[12]
- designated initializers[13] (based on the C99 feature, and common g++ extension)
[=, this]
as a lambda capture[14]- template parameter lists on lambdas[15]
- three-way comparison using the "spaceship operator",
operator <=>
- initialization of an additional variable within a range-based
for
statement[16] - lambdas in unevaluated contexts[17][18]
- default constructible and assignable stateless lambdas[17][19]
- allow pack expansions in lambda init-capture[17][20]
- class types in non-type template parameters, also allowing string literals as template parameters[21]
- removing the need for
typename
in certain circumstances[22] - new standard attributes
[[no_unique_address]]
,[23][[likely]]
and[[unlikely]]
[24] - conditional
explicit
, allowing theexplicit
modifier to be contingent on a Boolean expression[25] - expanded
constexpr
: virtual functions,[26]union
,[27]try
andcatch
,[28]dynamic_cast
andtypeid
,[29]std::pointer_traits
[30] - immediate functions using the new
consteval
keyword[31] - signed integers are now defined to be represented using two's complement (signed integer overflow remains undefined behavior)[32]
- a revised memory model[33]
- various improvements to structured bindings (interaction with lambda captures,
static
andthread_local
storage duration)[34][35] - coroutines[36]
using
on scopedenum
s[37]constinit
keyword[38]
Library
- ranges (The One Ranges Proposal)[39]
std::make_shared
andstd::allocate_shared
for arrays[40]- atomic smart pointers (such as
std::atomic<shared_ptr<T>>
andstd::atomic<weak_ptr<T>>
)[41] std::to_address
to convert a pointer to a raw pointer[42]- calendar and time-zone additions to
<chrono>
[43] std::span
, providing a view to a contiguous array (analogous tostd::string_view
butspan
can mutate the referenced sequence)[44]std::erase
andstd::erase_if
, simplifying element erasure for most standard containers[45]<version>
header[46]std::bit_cast<>
for type casting of object representations, with less verbosity thanmemcpy()
and more ability to exploit compiler internals[47]- feature test macros[48]
- various constexpr library bits[49]
- smart pointer creation with default initialization[50]
contains
-method for associative containers[51]- bit operations, such as leading/trailing zero/one count,[52] and log2 operations[53][54][55]
std::bind_front
[56]
New and changed keywords
Many new keywords added (and the new "spaceship operator", operator <=>
), such as concept
, constinit
,[38] consteval
, co_await
, co_return
, co_yield
, requires
(plus changed meaning for export
), and char8_t
(for UTF-8 support).[57] And explicit
can take an expression since C++20.[58] Most of the uses of the volatile
keyword have been deprecated.[59]
In addition to keywords, there are identifiers with special meaning, including new import
and module
.
New attributes in C++20:
[[likely]]
, [[unlikely]]
, and [[no_unique_address]]
[60]
Removed and deprecated
Removed features:[61]
- The C-derived headers
<ccomplex>
,<ciso646>
,<cstdalign>
,<cstdbool>
and<ctgmath>
were removed, as they serve no purpose in C++. (The corresponding<*.h>
headers remain, for compatibility with C.) - The use of
throw()
as an exception specification was removed. - Some previously deprecated library features were removed, including
std::uncaught_exception
,std::raw_storage_iterator
,std::is_literal_type
,std::is_literal_type_v
,std::result_of
andstd::result_of_t
.
Deprecated features:
Published as Technical Specifications
Deferred to a later standard
- Contracts – a new study group (SG21) has been formed to work on a new proposal[66]
- Reflection[67][68]
- Metaclasses[69]
- Executors[70]
- Networking extensions,[71][72] including async, basic I/O services, timers, buffers and buffer-oriented streams, sockets, and Internet protocols (blocked by executors)
- Properties[73]
- Extended futures[74]
Compiler support
Full support[75]
- Visual Studio 2019 supports all C++20 features through its
/std:c++latest
option, as of version 16.10.0.[76] An option/std:c++20
to enable C++20 mode is added in version 16.11.0.[77][78]
Microsoft's compiler supports not only Windows but also Linux, Android, and iOS. However, for Linux development, it requires the "Visual C++ for Linux Development" extension. [79]
Partial
- Clang has partial C++20 support that can be enabled with the option
-std=c++20
(version 10 and later) or-std=c++2a
(version 9 and earlier).[80] - EDG started implementing C++20 features in version 5.0 and as of version 6.1 supports most C++20 core language features.[81]
- GCC added partial, experimental C++20 support in 2017[82] in version 8 through the option
-std=c++2a
. Like Clang, GCC replaced this option with-std=c++20
in version 10. It also has an option to enable GNU extensions in addition to the experimental C++20 support,-std=gnu++20
.[83]
History
Summarize
Perspective
Changes applied to the C++20 working draft in July 2017 (Toronto) include:[84]
- concepts (what made it into the standard is a cut-down version; also described as "Concepts Lite"[85])
- designated initializers
[=, this]
as a lambda capture- template parameter lists on lambdas
std::make_shared
andstd::allocate_shared
for arrays
Changes applied to the C++20 working draft in the fall meeting in November 2017 (Albuquerque) include:[86][87]
- three-way comparison using the "spaceship operator",
operator <=>
- initialization of an additional variable within a range-based
for
statement - lambdas in unevaluated contexts
- default constructible and assignable stateless lambdas
- allow pack expansions in lambda init-capture
- string literals as template parameters
- atomic smart pointers (such as
std::atomic<shared_ptr<T>>
andstd::atomic<weak_ptr<T>>
) std::to_address
to convert a pointer to a raw pointer
Changes applied to the C++20 working draft in March 2018 (Jacksonville) include:[88]
- removing the need for
typename
in certain circumstances - new standard attributes
[[no_unique_address]]
,[[likely]]
and[[unlikely]]
- calendar and time-zone additions to
<chrono>
std::span
, providing a view to a contiguous array (analogous tostd::string_view
butspan
can mutate the referenced sequence)<version>
header
Changes applied to the C++20 working draft in the summer meeting in June 2018 (Rapperswil) include:[89]
contracts(later deferred to a later standard)[90]- feature test macros
- bit-casting of object representations, with less verbosity than
memcpy()
and more ability to exploit compiler internals - conditional
explicit
, allowing the explicit modifier to be contingent on a Boolean expression - constexpr virtual functions
Changes applied to the C++20 working draft in the fall meeting in November 2018 (San Diego) include:[91]
- ranges (The One Ranges Proposal)
- concept terse syntax
constexpr
union
,try
andcatch
,dynamic_cast
,typeid
andstd::pointer_traits
.- various
constexpr
library bits - immediate functions using the new
consteval
keyword - signed integers are now defined to be represented using two's complement (signed integer overflow remains undefined behavior)
refinements of the contracts facility (access control in contract conditions)[92] (see list of features deferred to a later standard)- a revised memory model
- smart pointer creation with default initialization
Changes applied to the C++20 working draft in the winter meeting in February 2019 (Kona) include:[93][94][95]
- coroutines
- modules
- various improvements to structured bindings (interaction with lambda captures,
static
andthread_local
storage duration)
Changes applied to the C++20 working draft in the summer meeting in July 2019 (Cologne) include:[96][97][98][99]
- contracts were removed (see list of features deferred to a later standard)[100]
- use of comma operator in subscript expressions has been deprecated[62]
constexpr
additions (trivial default initialization,[101] unevaluated inline-assembly[102])- using scoped
enum
s[37] - various changes to the spaceship operator[103][104]
- DR: minor changes to modules[105]
constinit
keyword- changes to concepts (removal of
-> Type
return-type-requirements[106]) - (most of)
volatile
has been deprecated[59] - DR:
[[nodiscard]]
effects on constructors[107] - The new standard library concepts will not use PascalCase (rather
standard_case
, as the rest of the standard library)[108] - text formatting (
std::format
, [109][110]chrono
integration,[111] corner case fixes[112]) - bit operations[52]
constexpr INVOKE
[113]- math constants[114]
- consistency additions to atomics (
std::atomic_ref<T>
,[115]std::atomic<std::shared_ptr<T>>
[116]) - add the
<=>
operator to the standard library[117] - header units for the standard library[118]
- synchronization facilities[119] (merged from: Efficient atomic waiting and semaphores,[120] latches and barriers,[121] Improving
atomic_flag
,[122] Don't Make C++ Unimplementable On Small CPUs[123]) std::source_location
[124]constexpr
containers (std::string
,[125]std::vector
[126])std::stop_token
and joining thread (std::jthread
)[127]
Changes applied during the NB comment resolution in the fall meeting in November 2019 (Belfast) include:[128][129][130][131]
- Class Types in Non-Type Template Parameters (NTTP): The restriction of no user-defined
operator==
allowed has been removed as the meaning of template argument equality has been divorced fromoperator==
.[132] This allows also for array members in class-type NTTP. - Floating-point types,[133] pointers and references and unions and union-like classes (class types containing anonymous unions) are now allowed as NTTP.
- Function identity now also includes trailing requires-clauses (P1971)
- Constrained non-template functions have been removed
<compare>
is now available in freestanding implementations[134]std::span
s typedef was changed fromindex_type
tosize_type
to be consistent with the rest of the standard library[135]- Concept traits have been renamed to follow the renaming of the concepts as a result from the Cologne meeting
- Several fixes and additions to ranges (P1456R1: Move-only views,[136] P1391R4: Range constructor for
std::string_view
(constructor from iterator-pair of characters),[137] P1394R4: Range constructor forstd::span<ref>
,[138] P1870R1: forwarding-range<T> is too subtle[139]) - Initialization for
std::atomic<T>
has been changed to make it work with default and list initialization,[140]std::latch
andstd::barrier
can now report the maximum number of threads that the implementation supports through the new member functionmax()
std::weak_equality
andstd::strong_equality
have been removed as they are not used anymore- Algorithms in
<numeric>
have been madeconstexpr
- Missing feature-test macros for new or changed features of C++20 have been added[141]
References
External links
Wikiwand - on
Seamless Wikipedia browsing. On steroids.