C++20

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search

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 C++ Standards Committee began planning C++20 in July 2017.[2] The current draft is N4849.[3]

C++20 adds more new major features than C++14 or C++17.[4]

With the end of the summer 2019 meeting in Cologne the CD (Committee Draft) ballot phase opened. In the fall 2019 meeting in Belfast comment processing has been started in order to finalize the C++20 standard revision.

Below is a partial list of changes that have been accepted into or have been discussed for inclusion into C++20.[5]

New features[edit]

Changes applied to the C++20 working draft in July 2017 (Toronto) include:[6]

  • concepts[7]
  • designated initializers[8] (based on the C99 feature)
  • [=, this] as a lambda capture[9]
  • template parameter lists on lambdas[10]


Changes applied to the C++20 working draft in the fall meeting in November 2017 (Albuquerque) include:[11][12]

  • three-way comparison using the "spaceship operator", operator <=>
  • initialization of an additional variable within a range-based for statement[13]
  • lambdas in unevaluated contexts[14][15]
  • default constructible and assignable stateless lambdas[14][16]
  • allow pack expansions in lambda init-capture[14][17]
  • string literals as template parameters[14][18]
  • atomic smart pointers (such as std::atomic<shared_ptr<T>> and std::atomic<weak_ptr<T>>)[19]


Changes applied to the C++20 working draft in March 2018 (Jacksonville) include:[20]

  • removing the need for typename in certain circumstances[21]
  • new standard attributes [[no_unique_address]],[22] [[likely]] and [[unlikely]][23]
  • calendar and time-zone additions to <chrono>[24]
  • std::span, providing a view to a contiguous array (analogous to std::string_view but span can mutate the referenced sequence)[25]
  • <version> header[26]


Changes applied to the C++20 working draft in the summer meeting in June 2018 (Rapperswil) include:[27]

  • contracts[28] (see list of features deferred to a later standard)
  • feature test macros[29]
  • bit-casting of object representations, with less verbosity than memcpy() and more ability to exploit compiler internals[30]
  • conditional explicit, allowing the explicit modifier to be contingent on a boolean expression[31]
  • constexpr virtual functions[32]


Changes applied to the C++20 working draft in the fall meeting in November 2018 (San Diego) include:


Changes applied to the C++20 working draft in the winter meeting in February 2019 (Kona) include:[44][45]

  • coroutines[46] – already experimentally supported in Clang 5[47]
  • modules[48] – experimentally supported in Clang 5[49] and Visual Studio 2015 Update 1[50] as well as GCC[51]
  • various improvements to structured bindings (interaction with lambda captures, static and thread_local storage duration)[52][53]


Changes applied to the C++20 working draft in the summer meeting in July 2019 (Cologne) include:[54][55][56]

  • contracts have been removed (see list of features deferred to a later standard)[57]
  • use of comma operator in subscript expressions has been deprecated[58]
  • constexpr additions (trivial default initialization,[59] unevaluated inline-assembly[60])
  • using scoped enums[61]
  • various changes to the spaceship-operator[62][63]
  • DR: minor changes to modules[64]
  • constinit keyword[65]
  • changes to concepts (removal of -> Type return-type-requirements[66])
  • (most of) volatile has been deprecated[67]
  • DR: [[nodiscard]] effects on constructors[68]
  • The new standard library concepts will not use PascalCase (rather standard_case, as rest of standard library)[69]
  • text formatting[70][71] (chrono integration,[72] corner case fixes[73])
  • bit operations[74]
  • constexpr INVOKE[75]
  • math constants[76]
  • consistency additions to atomics (std::atomic_ref<T>,[77] std::atomic<std::shared_ptr<T>>[78])
  • add the spaceship (<=>) operator to the standard library[79]
  • header units for the standard library[80]
  • synchronization facilities[81] (merged from: Efficient atomic waiting and semaphores,[82] latches and barriers,[83] Improving atomic_flag,[84] Don't Make C++ Unimplementable On Small CPUs[85])
  • std::source_location[86]
  • constexpr containers (std::string,[87] std::vector[88])
  • std::stop_token and joining thread (std::jthread)[89]


Changes applied during the NB comment resolution in the fall meeting in November 2019 (Belfast) include[90][91][92]:

  • 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 from operator==[93]. This allows also for array members in class-type NTTP.
  • Floating-point types[94], 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[95]
  • std::spans typedef was changed from index_type to size_type to be consistent with the rest of the standard library[96]
  • 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[97], P1391R4: Range constructor for std::string_view (constructor from iterator-pair of characters)[98], P1394R4: Range constructor for std::span<ref>[99], P1870R1: forwarding-range<T> is too subtle[100])
  • Initialization for std::atomic<T> has been changed to make it work with default and list initialization[101], std::latch and std::barrier can now report the maximum number of threads that the implementation supports through the new member function max()
  • std::weak_equality and std::strong_equality have been removed as they are not used anymore
  • Algorithms in <numeric> have been made constexpr
  • Missing feature-test macros for new or changed features of C++20 have been added[102]

New (and changed) keywords[edit]

Many new keywords added (and the new "spaceship operator", operator <=>), such as concept, constinit,[65] consteval, co_await, co_return, co_yield, requires (plus changed meaning for export), and char8_t.[103] And explicit can take an expression since C++20.[104] Most of the uses of the volatile keyword have been deprecated.[67]

In addition to keywords, there are identifiers with special meaning, including new import and module.

C++ has added a number of attributes over the years, including new in C++20, [[likely]] and [[unlikely]]; and [[no_unique_address]].[105]

Features published as Technical Specifications[edit]

Features deferred to a later standard[edit]

  • Contracts – a new study group (SG21) has been formed to work on a new proposal[110]
  • Reflection[111][112]
  • Metaclasses[113]
  • Executors[114]
  • Networking extensions,[115][116] including async, basic I/O services, timers, buffers and buffer-oriented streams, sockets, and Internet protocols (blocked by executors)
  • Properties[117]
  • Extended futures[118]

See also[edit]

References[edit]

  1. ^ "The next standard after C++17 will be C++20"., by Herb Sutter
  2. ^ "Recent milestones: C++17 published, C++20 underway". Retrieved 2019-10-15.
  3. ^ "Working Draft, Standard for Programming Language C++" (PDF).
  4. ^ "Why does the C++ standard ship every three years?".
  5. ^ "P0592R0: To boldly suggest an overall plan for C++20".
  6. ^ Herb Sutter. "Trip report: Summer ISO C++ standards meeting (Toronto)".
  7. ^ "P0606R0: Concepts Are Ready" (PDF).
  8. ^ Tim Shen; Richard Smith. "Designated Initialization Wording".
  9. ^ Thomas Köppe. "Allow lambda capture [=, this]".
  10. ^ "Familiar template syntax for generic lambdas".
  11. ^ Herb Sutter. "Trip report: Fall ISO C++ standards meeting (Albuquerque)".
  12. ^ Smith, Richard; Perchik, Dawn; Köppe, Thomas. "N4714 Editors' Report -- Programming Languages -- C++". C++ standards drafts. GitHub. Retrieved 27 December 2018.
  13. ^ "Range-based for statements with initializer".
  14. ^ a b c d "Trip Report: C++ Standards Meeting in Albuquerque, November 2017". There's Waldo!. 2017-11-20. Retrieved 2017-12-11.
  15. ^ "Wording for lambdas in unevaluated contexts" (PDF).
  16. ^ "Default constructible and assignable stateless lambdas" (PDF).
  17. ^ "Pack expansion in lambda init-capture". www.open-std.org. Retrieved 2017-12-11.
  18. ^ "String literals as non-type template parameters" (PDF).
  19. ^ Meredith, Alisdair; Sutter, Herb. "Revising atomic_shared_ptr for C++20". JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP. ISO. Retrieved 27 December 2018.
  20. ^ Botond Ballo. "Trip Report: C++ Standards Meeting in Jacksonville, March 2018".
  21. ^ Nina Ranns; Daveed Vandevoorde. "Down with typename!".
  22. ^ "Language support for empty objects".
  23. ^ "Proposed wording for likely and unlikely attributes (Revision 5)".
  24. ^ Howard E. Hinnant; Tomasz Kamiński. "Extending <chrono> to Calendars and Time Zones".
  25. ^ Neil MacIntosh; Stephan T. Lavavej. "span: bounds-safe views for sequences of objects".
  26. ^ Alan Talbot. "<version>".
  27. ^ Herb Sutter. "Trip report: Summer ISO C++ standards meeting (Rapperswil)".
  28. ^ "Support for contract based programming in C++". www.open-std.org. Retrieved 2018-11-10.
  29. ^ "Integrating feature-test macros into the C++ WD". www.open-std.org. Retrieved 2018-11-10.
  30. ^ "Bit-casting object representations". www.open-std.org. Retrieved 2018-11-10.
  31. ^ "explicit(bool)". www.open-std.org. Retrieved 2018-11-13.
  32. ^ "Allowing Virtual Function Calls in Constant Expressions". www.open-std.org. Retrieved 2019-03-11.
  33. ^ "P0896R3" (PDF).
  34. ^ "P1141R1 - Yet another approach for constrained declarations".
  35. ^ "P1330R0 - Changing the active member of a union inside constexpr".
  36. ^ "P1002R0 - Try-catch blocks in constexpr functions" (PDF).
  37. ^ "P1327R0 - Allowing dynamic_cast, polymorphic typeid in Constant Expressions".
  38. ^ "P1006R1 - Constexpr in std::pointer_traits" (PDF).
  39. ^ "P1032R1 - Misc constexpr bits".
  40. ^ "P1073R2 - Immediate functions".
  41. ^ "P1236R0: Alternative Wording for P0907R4 Signed Integers are Two's Complement".
  42. ^ "P1289R0 - Access control in contract conditions" (PDF).
  43. ^ "P0668R4: Revising the C++ memory model".
  44. ^ "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.
  45. ^ "Trip report: Winter ISO C++ standards meeting (Kona)". Sutter’s Mill. 2019-02-23. Retrieved 2019-02-24.
  46. ^ "N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines" (PDF).
  47. ^ "Clang 5 Release Notes on coroutines".
  48. ^ "N4720: Working Draft, Extensions to C++ for Modules" (PDF).
  49. ^ "Clang 5 documentation on Modules".
  50. ^ "C++ Modules in VS 2015 Update 1".
  51. ^ "cxx-modules - GCC Wiki". gcc.gnu.org. Retrieved 2019-02-24.
  52. ^ "P1091R1: Extending structured bindings to be more like variable declarations". www.open-std.org. Retrieved 2019-02-24.
  53. ^ "P1091R2: Extending structured bindings to be more like variable declarations". www.open-std.org. Retrieved 2019-02-24.
  54. ^ "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.
  55. ^ Botond Ballo. "Trip Report: C++ Standards Meeting in Cologne, July 2019".
  56. ^ Sutter, Herb. "Trip report: Summer ISO C++ standards meeting (Cologne)".
  57. ^ Josuttis, Nicolai. "P1823R0: Remove Contracts from C++20" (PDF).
  58. ^ "P1161R2: Deprecate uses of the comma operator in subscripting expressions". www.open-std.org. Retrieved 2019-07-20.
  59. ^ "Permitting trivial default initialization in constexpr contexts" (PDF).
  60. ^ "P1668R1: Enabling Constexpr Intrinsics By Permitting Unevaluated inline-asm in Constexpr Functions". www.open-std.org. Retrieved 2019-07-20.
  61. ^ "P1099R5: Using Enum". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  62. ^ "P1186R3: When do you actually use <=>?". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  63. ^ "P1630R1: Spaceship needs a tune-up". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  64. ^ "P1766R1: Mitigating minor modules maladies". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  65. ^ a b "P1143R2: Adding the constinit keyword". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  66. ^ "P1452R2: On the non-uniform semantics of return-type-requirements". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  67. ^ a b "P1152R4: Deprecating volatile". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  68. ^ "P1771R1: nodiscard for constructors" (PDF). www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  69. ^ "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.
  70. ^ "P0645R10: Text Formatting". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  71. ^ "std::format in C++20". www.zverovich.net. 2019-07-23. Retrieved 2019-09-15.
  72. ^ "P1361R2: Integration of chrono with text formatting" (PDF). www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  73. ^ "P1652R1: Printf corner cases in std::format". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  74. ^ "P0553R4: Bit operations". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  75. ^ "P1965R2: constexpr INVOKE". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  76. ^ "P0631R8: Math Constants" (PDF). www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  77. ^ "P1643R1: Add wait/notify to atomic_ref<T>". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  78. ^ "P1664R0: Add wait/notify to atomic<shared_ptr<T>>". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  79. ^ "P1614R2: The Mothership has Landed - Adding <=> to the Library". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  80. ^ "P1502R1: Standard library header units for C++20". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  81. ^ "P1135R6: The C++20 Synchronization Library". www.open-std.org. 2019-07-20. Retrieved 2019-07-20.
  82. ^ "P0514R4: Efficient concurrent waiting for C++20" (PDF).
  83. ^ "P0666R2: Revised Latches and Barriers for C++20" (PDF).
  84. ^ "P0995R1: Improving atomic_flag".
  85. ^ "P1285R0: Don't Make C++ Unimplementable On Small CPUs".
  86. ^ "P1208R6: Adopt source_location from Library Fundamentals V3 for C++20" (PDF).
  87. ^ "P0980R1: Making std::string constexpr" (PDF).
  88. ^ "P1004R2: Making std::vector constexpr" (PDF).
  89. ^ "P0660R10: Stop Token and Joining Thread" (PDF).
  90. ^ "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.
  91. ^ Sutter, Herb (2019-11-09). "Trip report: Autumn ISO C++ standards meeting (Belfast)". Sutter’s Mill. Retrieved 2019-11-09.
  92. ^ botondballo (2019-11-15). "Trip Report: C++ Standards Meeting in Belfast, November 2019". There's Waldo!. Retrieved 2019-11-24.
  93. ^ "P1907R0: Inconsistencies with non-type template parameters". www.open-std.org. 2019-10-07. Retrieved 2019-11-09.
  94. ^ "P1714: NTTP are incomplete without float, double, and long double! (Revision 1)". www.open-std.org. 2019-07-19. Retrieved 2019-11-09.
  95. ^ "P1855R=: Make <compare> freestanding". www.open-std.org. 2019-10-05. Retrieved 2019-11-09.
  96. ^ "P1872R0: span should have size_type not index_type" (PDF). www.open-std.org. 2019-09-16. Retrieved 2019-11-09.
  97. ^ "P1456: Move-only views" (PDF). www.open-std.org. 2019-01-25. Retrieved 2019-11-09.
  98. ^ [P1391R4 "P1391: Range constructor for std::string_view"] Check |url= value (help). www.open-std.org. Retrieved 2019-11-09.
  99. ^ "P1394: Range constructor for std::span" (PDF). www.open-std.org. 2019-08-02. Retrieved 2019-11-09.
  100. ^ "P1870R1: forwarding-range<T> is too subtle". www.open-std.org. Retrieved 2019-11-09.
  101. ^ "P0883: Fixing Atomic Initialization" (PDF). www.open-std.org. 2018-06-05. Retrieved 2019-11-09.
  102. ^ "Missing feature-test macros 2018-2019". www.open-std.org. 2019-10-06. Retrieved 2019-11-09.
  103. ^ "C++ keywords - cppreference.com". en.cppreference.com. Retrieved 2019-08-04.
  104. ^ "explicit specifier - cppreference.com". en.cppreference.com. Retrieved 2019-08-04.
  105. ^ "attribute specifier sequence(since C++11) - cppreference.com". en.cppreference.com. Retrieved 2019-08-04.
  106. ^ "C++ Extensions for Parallelism Version 2".
  107. ^ "Task Blocks".
  108. ^ "C++ Extensions for Networking".
  109. ^ "C++ Extensions for Reflection".
  110. ^ Sutter, Herb (2019-07-20). "Trip report: Summer ISO C++ standards meeting (Cologne)". Sutter’s Mill. Retrieved 2019-07-21.
  111. ^ "Reflections on the reflection proposals - Meeting C++". meetingcpp.com. Retrieved 2017-06-30.
  112. ^ "Static reflection". www.open-std.org. Retrieved 2018-11-10.
  113. ^ Herb Sutter. "Metaclasses" (PDF).
  114. ^ "A Unified Executors Proposal for C++". www.open-std.org. Retrieved 2019-02-24.
  115. ^ "N4771: Working Draft, C++ Extensions for Networking" (PDF).
  116. ^ "ISO/IEC TS 19216:2018 Programming Languages -- C++ Extensions for Networking".
  117. ^ "A General Property Customization Mechanism". www.open-std.org. Retrieved 2019-02-24.
  118. ^ "A Unified Futures Proposal for C++".

External links[edit]

  • 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