C++20
C++20 is the informal name for the revision of the ISO/IEC standard for the C++ programming language expected to follow C++17.[1] The standard became technically finalized[2] by WG21 at the meeting in Prague in February 2020.[3] The standard is expected to be officially published after the end of the DIS ballot in May 2020.
C++20 adds more new major features than C++14 or C++17.[4] Below is a partial list of changes that have been accepted into or have been discussed for inclusion into C++20.[5]
New Features
C++20 introduced many new features. The following lists may be incomplete.
Language
- concepts[6], with terse syntax.[7]
- modules[8]
- designated initializers[9] (based on the C99 feature, and common G++ extension)
[=, this]
as a lambda capture[10]- template parameter lists on lambdas[11]
- three-way comparison using the "spaceship operator",
operator <=>
- initialization of an additional variable within a range-based
for
statement[12] - lambdas in unevaluated contexts[13][14]
- default constructible and assignable stateless lambdas[13][15]
- allow pack expansions in lambda init-capture[13][16]
- string literals as template parameters[13][17]
- removing the need for
typename
in certain circumstances[18] - new standard attributes
[[no_unique_address]]
,[19][[likely]]
and[[unlikely]]
[20] - conditional
explicit
, allowing the explicit modifier to be contingent on a boolean expression[21] - expanded
constexpr
: virtual functions,[22] union,[23] try and catch[24], dynamic_cast and typeid,[25] std::pointer_traits[26] - immediate functions using the new
consteval
keyword[27] - signed integers are now defined to be represented using two's complement (signed integer overflow remains undefined behavior)[28]
- a revised memory model[29]
- various improvements to structured bindings (interaction with lambda captures, static and thread_local storage duration)[30][31]
- coroutines[32]
using
on scoped enums[33]constinit
keyword[34]
Library
- ranges (The One Ranges Proposal)[35]
std::make_shared
andstd::allocate_shared
for arrays[36]- atomic smart pointers (such as
std::atomic<shared_ptr<T>>
andstd::atomic<weak_ptr<T>>
)[37] std::to_address
to convert a pointer to a raw pointer[38]- calendar and time-zone additions to
<chrono>
[39] std::span
, providing a view to a contiguous array (analogous tostd::string_view
butspan
can mutate the referenced sequence)[40]<version>
header[41]std::bit_cast<>
for type casting of object representations, with less verbosity thanmemcpy()
and more ability to exploit compiler internals[42]- feature test macros[43]
- various constexpr library bits[44]
- smart pointer creation with default initialization[45]
std::map::contains
method [46]
Deprecation
New (and changed) keywords
Many new keywords added (and the new "spaceship operator", operator <=>
), such as concept
, constinit
,[34] consteval
, co_await
, co_return
, co_yield
, requires
(plus changed meaning for export
), and char8_t
.[49] And explicit
can take an expression since C++20.[50] Most of the uses of the volatile
keyword have been deprecated.[48]
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]]
.[51]
History of changes
Changes applied to the C++20 working draft in July 2017 (Toronto) include:[52]
- concepts
- 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:[53][54]
- 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:[55]
- removing the need for
typename
in certain circumstances[56] - new standard attributes
[[no_unique_address]]
,[57][[likely]]
and[[unlikely]]
[58] - calendar and time-zone additions to
<chrono>
[59] std::span
, providing a view to a contiguous array (analogous tostd::string_view
butspan
can mutate the referenced sequence)[60]<version>
header[61]
Changes applied to the C++20 working draft in the summer meeting in June 2018 (Rapperswil) include:[62]
- contracts deferred to a later standard[63]
- feature test macros[64]
- bit-casting of object representations, with less verbosity than
memcpy()
and more ability to exploit compiler internals[65] - conditional
explicit
, allowing the explicit modifier to be contingent on a boolean expression[66] - constexpr virtual functions[67]
Changes applied to the C++20 working draft in the fall meeting in November 2018 (San Diego) include:
- ranges (The One Ranges Proposal)
- concept terse syntax
- constexpr union, try and catch, dynamic_cast, typeid and std::pointer_traits.
- various constexpr library bits[68]
- immediate functions using the new
consteval
keyword[69] - signed integers are now defined to be represented using two's complement (signed integer overflow remains undefined behavior)[70]
refinements of the contracts facility (access control in contract conditions)[71] (see list of features deferred to a later standard)- a revised memory model[72]
- Smart pointer creation with default initialization[73]
Changes applied to the C++20 working draft in the winter meeting in February 2019 (Kona) include:[74][75]
- coroutines[76] – already experimentally supported in Clang 5[77]
- modules[78] – experimentally supported in Clang 5[79] and Visual Studio 2015 Update 1[80] as well as GCC[81]
- various improvements to structured bindings (interaction with lambda captures, static and thread_local storage duration)[82][83]
Changes applied to the C++20 working draft in the summer meeting in July 2019 (Cologne) include:[84][85][86]
- contracts have been removed (see list of features deferred to a later standard)[87]
- use of comma operator in subscript expressions has been deprecated[88]
- constexpr additions (trivial default initialization,[89] unevaluated inline-assembly[90])
- using scoped enums[91]
- various changes to the spaceship operator[92][93]
- DR: minor changes to modules[94]
constinit
keyword- changes to concepts (removal of
-> Type
return-type-requirements[95]) - (most of)
volatile
has been deprecated[48] - DR:
[[nodiscard]]
effects on constructors[96] - The new standard library concepts will not use PascalCase (rather standard_case, as the rest of the standard library)[97]
- text formatting[98][99] (chrono integration,[100] corner case fixes[101])
- bit operations[102]
constexpr INVOKE
[103]- math constants[104]
- consistency additions to atomics (
std::atomic_ref<T>
,[105]std::atomic<std::shared_ptr<T>>
[106]) - add the
<=>
operator to the standard library[107] - header units for the standard library[108]
- synchronization facilities[109] (merged from: Efficient atomic waiting and semaphores,[110] latches and barriers,[111] Improving atomic_flag,[112] Don't Make C++ Unimplementable On Small CPUs[113])
std::source_location
[114]- constexpr containers (
std::string
,[115]std::vector
[116]) std::stop_token
and joining thread (std::jthread
)[117]
Changes applied during the NB comment resolution in the fall meeting in November 2019 (Belfast) include[118][119][120]:
- 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==
.[121] This allows also for array members in class-type NTTP. - Floating-point types,[122] 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[123]std::span
s typedef was changed fromindex_type
tosize_type
to be consistent with the rest of the standard library[124]- 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,[125] P1391R4: Range constructor for
std::string_view
(constructor from iterator-pair of characters),[126] P1394R4: Range constructor forstd::span<ref>
,[127] P1870R1: forwarding-range<T> is too subtle[128]) - Initialization for
std::atomic<T>
has been changed to make it work with default and list initialization,[129]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[130]
Features published as Technical Specifications
Features deferred to a later standard
- Contracts – a new study group (SG21) has been formed to work on a new proposal[135]
- Reflection[136][137]
- Metaclasses[138]
- Executors[139]
- Networking extensions,[140][141] including async, basic I/O services, timers, buffers and buffer-oriented streams, sockets, and Internet protocols (blocked by executors)
- Properties[142]
- Extended futures[143]
See also
References
- "The next standard after C++17 will be C++20"., by Herb Sutter
- Sutter, Herb (2019-10-01). "P1000R3: C++ IS schedule" (PDF). Retrieved 2020-02-13.
- Dusíková, Hana (2019-11-06). "N4817: 2020 Prague Meeting Invitation and Information" (PDF). Retrieved 2020-02-13.
- "Why does the C++ standard ship every three years?".
- "P0592R0: To boldly suggest an overall plan for C++20".
- "P0606R0: Concepts Are Ready" (PDF).
- "P1141R1 - Yet another approach for constrained declarations".
- "N4720: Working Draft, Extensions to C++ for Modules" (PDF).
- Tim Shen; Richard Smith. "Designated Initialization Wording".
- Thomas Köppe. "Allow lambda capture [=, this]".
- "Familiar template syntax for generic lambdas".
- "Range-based for statements with initializer".
- "Trip Report: C++ Standards Meeting in Albuquerque, November 2017". There's Waldo!. 2017-11-20. Retrieved 2017-12-11.
- "Wording for lambdas in unevaluated contexts" (PDF).
- "Default constructible and assignable stateless lambdas" (PDF).
- "Pack expansion in lambda init-capture". www.open-std.org. Retrieved 2017-12-11.
- "String literals as non-type template parameters" (PDF).
- Nina Ranns; Daveed Vandevoorde. "Down with typename!".
- "Language support for empty objects".
- "Proposed wording for likely and unlikely attributes (Revision 5)".
- "explicit(bool)". www.open-std.org. Retrieved 2018-11-13.
- "Allowing Virtual Function Calls in Constant Expressions". www.open-std.org. Retrieved 2019-03-11.
- "P1330R0 - Changing the active member of a union inside constexpr".
- "P1002R0 - Try-catch blocks in constexpr functions" (PDF).
- "P1327R0 - Allowing dynamic_cast, polymorphic typeid in Constant Expressions".
- "P1006R1 - Constexpr in std::pointer_traits" (PDF).
- "P1073R2 - Immediate functions".
- "P1236R0: Alternative Wording for P0907R4 Signed Integers are Two's Complement".
- "P0668R4: Revising the C++ memory model".
- "P1091R1: Extending structured bindings to be more like variable declarations". www.open-std.org. Retrieved 2019-02-24.
- "P1091R2: Extending structured bindings to be more like variable declarations". www.open-std.org. Retrieved 2019-02-24.
- "N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines" (PDF).
- "P1099R5: Using Enum". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1143R2: Adding the constinit keyword". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P0896R3" (PDF).
- "Extending make_shared to Support Arrays".
- Meredith, Alisdair; Sutter, Herb. "Revising atomic_shared_ptr for C++20". JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP. ISO. Retrieved 27 December 2018.
- "Utility to convert a pointer to a raw pointer".
- Howard E. Hinnant; Tomasz Kamiński. "Extending <chrono> to Calendars and Time Zones".
- Neil MacIntosh; Stephan T. Lavavej. "span: bounds-safe views for sequences of objects".
- Alan Talbot. "<version>".
- "Bit-casting object representations". www.open-std.org. Retrieved 2018-11-10.
- "Integrating feature-test macros into the C++ WD". www.open-std.org. Retrieved 2018-11-10.
- "P1032R1 - Misc constexpr bits".
- "Smart pointer creation with default initialization".
- "std::map::contains - cppreference.com". en.cppreference.com. Retrieved 2020-05-12.
- "P1161R2: Deprecate uses of the comma operator in subscripting expressions". www.open-std.org. Retrieved 2019-07-20.
- "P1152R4: Deprecating volatile". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "C++ keywords - cppreference.com". en.cppreference.com. Retrieved 2019-08-04.
- "explicit specifier - cppreference.com". en.cppreference.com. Retrieved 2019-08-04.
- "attribute specifier sequence(since C++11) - cppreference.com". en.cppreference.com. Retrieved 2019-08-04.
- Herb Sutter. "Trip report: Summer ISO C++ standards meeting (Toronto)".
- Herb Sutter. "Trip report: Fall ISO C++ standards meeting (Albuquerque)".
- Smith, Richard; Perchik, Dawn; Köppe, Thomas. "N4714 Editors' Report -- Programming Languages -- C++". C++ standards drafts. GitHub. Retrieved 27 December 2018.
- Botond Ballo. "Trip Report: C++ Standards Meeting in Jacksonville, March 2018".
- Nina Ranns; Daveed Vandevoorde. "Down with typename!".
- "Language support for empty objects".
- "Proposed wording for likely and unlikely attributes (Revision 5)".
- Howard E. Hinnant; Tomasz Kamiński. "Extending <chrono> to Calendars and Time Zones".
- Neil MacIntosh; Stephan T. Lavavej. "span: bounds-safe views for sequences of objects".
- Alan Talbot. "<version>".
- Herb Sutter. "Trip report: Summer ISO C++ standards meeting (Rapperswil)".
- "Support for contract based programming in C++". www.open-std.org. Retrieved 2018-11-10.
- "Integrating feature-test macros into the C++ WD". www.open-std.org. Retrieved 2018-11-10.
- "Bit-casting object representations". www.open-std.org. Retrieved 2018-11-10.
- "explicit(bool)". www.open-std.org. Retrieved 2018-11-13.
- "Allowing Virtual Function Calls in Constant Expressions". www.open-std.org. Retrieved 2019-03-11.
- "P1032R1 - Misc constexpr bits".
- "P1073R2 - Immediate functions".
- "P1236R0: Alternative Wording for P0907R4 Signed Integers are Two's Complement".
- "P1289R0 - Access control in contract conditions" (PDF).
- "P0668R4: Revising the C++ memory model".
- "Smart pointer creation with default initialization".
- "r/cpp - 2019-02 Kona ISO C++ Committee Trip Report (C++20 design is complete; Modules in C++20; Coroutines in C++20; Reflection TS v1 published; work begins on a C++ Ecosystem Technical Report)". reddit. Retrieved 2019-02-24.
- "Trip report: Winter ISO C++ standards meeting (Kona)". Sutter’s Mill. 2019-02-23. Retrieved 2019-02-24.
- "N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines" (PDF).
- "Clang 5 Release Notes on coroutines".
- "N4720: Working Draft, Extensions to C++ for Modules" (PDF).
- "Clang 5 documentation on Modules".
- "C++ Modules in VS 2015 Update 1".
- "cxx-modules - GCC Wiki". gcc.gnu.org. Retrieved 2019-02-24.
- "P1091R1: Extending structured bindings to be more like variable declarations". www.open-std.org. Retrieved 2019-02-24.
- "P1091R2: Extending structured bindings to be more like variable declarations". www.open-std.org. Retrieved 2019-02-24.
- "r/cpp - 2019-07 Cologne ISO C++ Committee Trip Report — 🚀 The C++20 Eagle has Landed 🚀 (C++20 Committee Draft shipped; Contracts Moved From C++20 to a Study Group; `std::format` in C++20; C++20 Synchronization Library)". reddit. Retrieved 2019-09-15.
- Botond Ballo. "Trip Report: C++ Standards Meeting in Cologne, July 2019".
- Sutter, Herb. "Trip report: Summer ISO C++ standards meeting (Cologne)".
- Josuttis, Nicolai. "P1823R0: Remove Contracts from C++20" (PDF).
- "P1161R2: Deprecate uses of the comma operator in subscripting expressions". www.open-std.org. Retrieved 2019-07-20.
- "Permitting trivial default initialization in constexpr contexts" (PDF).
- "P1668R1: Enabling Constexpr Intrinsics By Permitting Unevaluated inline-asm in Constexpr Functions". www.open-std.org. Retrieved 2019-07-20.
- "P1099R5: Using Enum". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1186R3: When do you actually use <=>?". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1630R1: Spaceship needs a tune-up". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1766R1: Mitigating minor modules maladies". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1452R2: On the non-uniform semantics of return-type-requirements". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1771R1: nodiscard for constructors" (PDF). www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1754R1: Rename concepts to standard_case for C++20, while we still can" (PDF). www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P0645R10: Text Formatting". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "std::format in C++20". www.zverovich.net. 2019-07-23. Retrieved 2019-09-15.
- "P1361R2: Integration of chrono with text formatting" (PDF). www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1652R1: Printf corner cases in std::format". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P0553R4: Bit operations". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1965R2: constexpr INVOKE". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P0631R8: Math Constants" (PDF). www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1643R1: Add wait/notify to atomic_ref<T>". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1664R0: Add wait/notify to atomic<shared_ptr<T>>". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1614R2: The Mothership has Landed - Adding <=> to the Library". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1502R1: Standard library header units for C++20". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P1135R6: The C++20 Synchronization Library". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
- "P0514R4: Efficient concurrent waiting for C++20" (PDF).
- "P0666R2: Revised Latches and Barriers for C++20" (PDF).
- "P0995R1: Improving atomic_flag".
- "P1285R0: Don't Make C++ Unimplementable On Small CPUs".
- "P1208R6: Adopt source_location from Library Fundamentals V3 for C++20" (PDF).
- "P0980R1: Making std::string constexpr" (PDF).
- "P1004R2: Making std::vector constexpr" (PDF).
- "P0660R10: Stop Token and Joining Thread" (PDF).
- "r/cpp - 2019-11 Belfast ISO C++ Committee Trip Report — Started Processing Feedback on the C++20 Committee Draft; ABI Review Group Formed". reddit. Retrieved 2019-11-09.
- Sutter, Herb (2019-11-09). "Trip report: Autumn ISO C++ standards meeting (Belfast)". Sutter’s Mill. Retrieved 2019-11-09.
- botondballo (2019-11-15). "Trip Report: C++ Standards Meeting in Belfast, November 2019". There's Waldo!. Retrieved 2019-11-24.
- "P1907R0: Inconsistencies with non-type template parameters". www.open-std.org. 2019-10-07. Retrieved 2019-11-09.
- "P1714: NTTP are incomplete without float, double, and long double! (Revision 1)". www.open-std.org. 2019-07-19. Retrieved 2019-11-09.
- "P1855R=: Make <compare> freestanding". www.open-std.org. 2019-10-05. Retrieved 2019-11-09.
- "P1872R0: span should have size_type not index_type" (PDF). www.open-std.org. 2019-09-16. Retrieved 2019-11-09.
- "P1456: Move-only views" (PDF). www.open-std.org. 2019-01-25. Retrieved 2019-11-09.
- [P1391R4 "P1391: Range constructor for std::string_view"] Check
|url=
value (help). www.open-std.org. Retrieved 2019-11-09. - "P1394: Range constructor for std::span" (PDF). www.open-std.org. 2019-08-02. Retrieved 2019-11-09.
- "P1870R1: forwarding-range<T> is too subtle". www.open-std.org. Retrieved 2019-11-09.
- "P0883: Fixing Atomic Initialization" (PDF). www.open-std.org. 2018-06-05. Retrieved 2019-11-09.
- "Missing feature-test macros 2018-2019". www.open-std.org. 2019-10-06. Retrieved 2019-11-09.
- "C++ Extensions for Parallelism Version 2".
- "Task Blocks".
- "C++ Extensions for Networking".
- "C++ Extensions for Reflection".
- Sutter, Herb (2019-07-20). "Trip report: Summer ISO C++ standards meeting (Cologne)". Sutter’s Mill. Retrieved 2019-07-21.
- "Reflections on the reflection proposals - Meeting C++". meetingcpp.com. Retrieved 2017-06-30.
- "Static reflection". www.open-std.org. Retrieved 2018-11-10.
- Herb Sutter. "Metaclasses" (PDF).
- "A Unified Executors Proposal for C++". www.open-std.org. Retrieved 2019-02-24.
- "N4771: Working Draft, C++ Extensions for Networking" (PDF).
- "ISO/IEC TS 19216:2018 Programming Languages -- C++ Extensions for Networking".
- "A General Property Customization Mechanism". www.open-std.org. Retrieved 2019-02-24.
- "A Unified Futures Proposal for C++".
External links
- JTC1/SC22/WG21 – the ISO/IEC C++ Standard Working Group (a.k.a. the C++ Standards Committee)
- Ranges (range-v3) github repository, by Eric Niebler