C++23

From HandWiki
Short description: Computer programming language

C++23 is the informal name for the next version of the ISO/IEC 14882 standard for the C++ programming language that will follow C++20. The final draft of this version is N4950.[1][2]

In February 2020, at the final meeting for C++20 in Prague, an overall plan for C++23 was adopted:[3][4] planned features for C++23 were library support for coroutines, a modular standard library, executors, and networking.

The first WG21 meeting focused on C++23 was intended to take place in Varna in early June 2020, but was cancelled due to the COVID-19 pandemic,[5][6] as was the November 2020 meeting in New York City [7][6] and the February 2021 meeting in Kona, Hawaii.[7] All meetings until November 2022 were virtual while the November 2022 meeting until the final meeting on February 2023 was hybrid.[7] The standard was technically finalized by WG21 at the hybrid meeting in Issaquah in February 2023.[8]

Modern "Hello, world" Example

After many library changes applied to the working draft, the new "Hello, world" program will be:

import std;

int main()
{
    std::println("Hello, world!");
}

Features

Changes that have been accepted into C++23 include:

Language

  • explicit this object parameter[9]
  • if consteval[10]
  • multidimensional subscript operator[11]
  • static call and subscript operators and static lambdas[12][13]
  • simplifying implicit move[14]
  • auto(x) and auto{x}[15]
  • new preprocessor directives:
  • extending the lifetime of some temporaries in range-based for loop[18]
  • new standard attribute assume(expression)[19]
  • class template argument deduction from inherited constructors[20]
  • labels at the end of the compound statement[21]
  • alias declarations in init-statements[22]
  • literal suffixes for std::size_t and the corresponding signed type[23]
  • extended floating-point types with literals (conditionally supported)[24]
  • optional () from nullary lambda expressions[25]
  • attributes on lambda expressions[26]
  • constexpr changes:
    • non-literal variables, labels, and gotos in constexpr functions[27]
    • allowing static and thread_local variables that are usable in constant expressions in constexpr functions[28]
    • constexpr function does not need its return type and parameter types to be literal type
    • it is now possible to write a constexpr function for which no invocation satisfies the requirements of a core constant expression[29]
  • narrowing contextual conversions to bool in static_assert and if constexpr[30]
  • trimming whitespaces before line splicing[31]
  • make declaration order layout mandated[32]
  • delimited escape sequences[33]
  • named universal character escapes[34]
  • text encoding changes:
    • support for UTF-8 as a portable source file encoding[35]
    • consistent character literal encoding[36]
    • character sets and encodings[37]

Library

Standard Library Module Support

  • standard library modules std and std.compat[38]

Coroutine Library Support

  • synchronous coroutine std::generator for ranges[39]

General Utilities Support

  • result type std::expected[40]
  • monadic operations for std::optional[41] and std::expected[42]
  • utility function std::to_underlying to get the underlying value of enum[43]
  • move-only callable wrapper std::move_only_function[44]
  • std::forward_like[45]
  • std::invoke_r[46]
  • std::bind_back[47]
  • std::byteswap[48]
  • std::unreachable: a function to mark unreachable code[49]
  • made std::tuple compatible with other tuple-like objects[50]
  • std::basic_common_reference specialization for std::reference_wrapper yielding reference types[51]
  • adding default arguments for std::pair's forwarding constructor[52]

Compile-time Support

  • constexpr support for:
    • std::type_info::operator==[53]
    • std::bitset[54]
    • std::unique_ptr[55]
    • for some <cmath> functions[56]
    • for integral overloads of std::to_chars and std::from_chars[57]
  • metaprogramming utilities:
    • type traits std::is_scoped_enum,[58] std::is_implicit_lifetime,[59] std::reference_constructs_from_temporary, and std::reference_converts_from_temporary.[60]
  • adding move-only types support for comparison concepts[61]

Iterators, Ranges, and Algorithm Support

  • new range conversion function std::ranges::to[62]
  • new constrained ranges algorithm:
    • std::ranges::starts_with
    • std::ranges::ends_with[63]
    • std::ranges::contains
    • std::ranges::contains_subrange[64]
    • std::ranges::find_last and other variants[65]
    • rangified versions of iota, shift_left, and shift_right[66]
    • range fold algorithms[67]
  • new std::ranges::range_adaptor_closure, a helper for defining user-defined range adaptor closures[47]
  • new range adaptors:
    • std::views::zip and other variants
    • std::views::adjacent and other variants[68]
    • std::views::join_with[69]
    • std::views::slide
    • std::views::chunk[70]
    • std::views::chunk_by[71]
    • std::views::as_rvalue[72]
    • std::views::as_const[73]
    • std::views::repeat[74]
    • std::views::stride[75]
    • std::views::cartesian_product[76]
    • std::views::enumerate[77]
  • rectifying constant iterators, sentinels, and ranges, that is, std::ranges::cbegin and other similar utilities returning constant iterators should be fully guaranteed even for shallow-const views (such as std::span)[73]
  • ranges iterators as inputs to non-ranges algorithms[78]
  • relaxing range adaptors to allow for move only types[79]
  • making multi-param constructors of some views explicit[80]

Memory Management Support

  • std::out_ptr and std::inout_ptr for C interoperability[81]
  • std::allocate_at_least and std::allocator::allocate_at_least[82]
  • explicit lifetime management function std::start_lifetime_as for implicit-lifetime types[83]
  • disallowing user specialization of std::allocator_traits[84]

String and Text Processing Support

  • new member functions and changes in string types:
    • std::basic_string_view::contains and std::basic_string::contains[85]
    • disabling construction from nullptr for std::basic_string and std::basic_string_view[86]
    • explicit range constructor for std::basic_string_view[87]
    • std::basic_string::resize_and_overwrite[88]
    • rvalue reference overload of std::basic_string::substr for efficient slicing[89]
  • formatting ranges, tuples, escaped presentation of characters and strings, std::thread::id, and stacktraces.[90][91][92]

Diagnostic Support

  • stacktrace library[93]

I/O Support

  • formatted output functions std::print and std::println from new header <print>[94]
  • spanstream library (std::span-based string stream) from new header <spanstream>[95]
  • a support for exclusive mode in std::fstreams[96]
  • std::basic_ostream::operator<<(const volatile void*)[97]

Containers Support

  • multidimensional-span std::mdspan[98][99][100][101]
  • constructability and assignability of containers from other compatible ranges[62]
  • flat set and flat map container adapters[102][103]
  • non-deduction context for allocators in container deduction guides[104]
  • heterogeneous erasure overloads for associative containers[105]
  • allowing iterator pair construction in stack and queue[106]
  • requiring std::span and std::basic_string_view to be trivially copyable[107]

C-Compatibility Support

  • new header <stdatomic.h>[108]

Language defect reports

  • C++ identifier syntax using Unicode Standard Annex 31[109]
  • allowing duplicate attributes[110]
  • changing scope of lambda trailing return type[111]
  • making overloaded comparison operators less breaking change[112]
  • undeprecating volatile compound assignments[113][114]
  • fixing the compatibility and portability of char8_t[115]
  • relaxing requirements on wchar_t to match existing practices[116]
  • allowing some pointers and references of this or unknown origin in constant expressions[117]
  • introduction of immediate-escalating functions promoted to immediate functions[118]
  • allowing static_assert(false) in uninstantiated template contexts

Library defect reports

  • changes in ranges library:
    • conditionally borrowed ranges[119]
    • repairing input range adaptors and std::counted_iterator[120]
    • relaxing the constraint on std::ranges::join_view[121]
    • renamed std::ranges::split_view to std::ranges::lazy_split_view and new split_view[122]
    • removed std::default_initializable constraint from concept std::ranges::view[123]
    • view with ownership and new std::ranges::owning_view[124]
    • fixed std::ranges::istream_view[125]
  • changes in text formatting library:
    • std::basic_format_string[126]
    • compile-time format string checks
    • reducing binary code size of std::format_to[127]
    • fixing locale handling in chrono formatters[128]
    • improving width estimation[129] and fill character allowances of std::format[130]
    • use of forwarding references in format arguments to allow non-const-formattable types[131]
  • fully constexpr std::variant and std::optional[132]
  • supporting types derived from std::variant in std::visit[133]

Removed features and deprecation

Removed features:

  • Garbage Collection Support and Reachability-Based Leak Detection. It was added to the standard since C++11 but no compilers support this feature until C++23.[134]
  • Mixed wide string literal concatenation.[135]
  • Non-encodable wide character literals and multicharacter wide character literals.[136]

Deprecated features:

  • std::aligned_storage and std::aligned_union[137]
  • std::numeric_limits::has_denorm[138]

Reverted deprecated features:

  • Use of comma operator in subscript expressions was no longer deprecated but the semantics has been changed to support overloadable n-adic operator[].
  • C headers (The corresponding <*.h> headers for compatibility with C)

Published as Technical Specifications

Compiler support

  • GCC added partial, experimental C++23 support in 2021 in version 11 through the option -std=c++2b or -std=c++23 It also has an option to enable GNU extensions in addition to the experimental C++23 support, -std=gnu++2b. [140]

History

In the absence of face-to-face WG21 meetings, the following changes were applied after several virtual WG21 meetings, where they were approved by straw polls.

The following were added after the virtual WG21 meeting of 9 November 2020, where they were approved by straw polls:[141]

  • Literal suffixes for std::size t and the corresponding signed type
  • A member function
    contains
    for
    std::basic_string
    and
    std::basic_string_view
    , to check whether or not the string contains a given substring or character
  • A stacktrace library (
    <stacktrace>
    ), based on Boost.Stacktrace
  • A type trait
    std::is_scoped_enum
  • The header
    <stdatomic.h>
    , for interoperability with C atomics

After the virtual WG21 meeting of 22 February 2021, following features are added where they were approved by straw polls:[142]

  • Removing unnecessary empty parameter list
    ()
    from lambda expressions.
  • Repairing input range adaptors and
    counted_iterator
    .
  • Relax the requirements for
    time_point::clock
    .[143]
  • std::visit
    for classes that are derived from
    std::variant
    .
  • Locks lock lockables.[144]
  • Conditionally borrowed ranges.
  • std::to_underlying
    .

After the summer 2021 ISO C++ standards plenary virtual meeting of June 2021, new features and defect reports were approved by straw polls:[145]

  • Consteval if (
    if consteval
    ).
  • Narrowing contextual conversions to
    bool
    .
  • Allowing duplicate attributes.
  • std::span
    -based string-stream (
    <spanstream>
    ).
  • std::out_ptr()
    and
    std::inout_ptr()
    .
  • constexpr for
    std::optional
    ,
    std::variant
    , and
    std::type_info::operator==
    .
  • Iterators pair constructors for
    std::stack
    (stack) and
    std::queue
    (queue).
  • Few changes of the ranges library:
    • Generalized
      starts_with
      and
      ends_with
      for arbitrary ranges.
    • Renamed
      split_view
      to
      lazy_split_view
      and new
      split_view
      .
    • Relaxing the constraint on
      join_view
      .
    • Removing
      default_initializable
      constraint from concept
      view
      .
    • Range constructor for
      std::basic_string_view
      .
  • Prohibiting
    std::basic_string
    and
    std::basic_string_view
    construction from nullptr.
  • std::invoke_r
    .
  • Improvements on
    std::format
    .
  • Adding default arguments for
    std::pair
    's forwarding constructor.

After the autumn 2021 ISO C++ standards plenary virtual meeting of October 2021, new features and defect reports were approved by straw polls:[146]

  • Non-literal variables, labels, and gotos in
    constexpr
    functions, but still ill-formed to evaluate them at compile-time.
  • Explicit this object parameter.
  • Changes on character sets and encodings.
  • New preprocessors:
    #elifdef
    and
    #elifndef
    . Both directives were added to C23 (C language update) and GCC 12.[147]
  • Allowing alias declarations in init-statement.
  • Overloading multidimensional subscript operator (e.g.
    arr[1, 2]
    ).
  • Decay copy in language:
    auto(x)
    or
    auto{x}
    .
  • Changes in text formatting library:
    • Fixing locale handling in chrono formatters.
    • Use of forwarding references in format arguments to allow
      std::generator
      -like types.
  • Addition of type alias
    std::pmr::stacktrace
    which is equivalent to
    std::basic_stacktrace<std::pmr::polymorphic_allocator>
    .[148]
  • Changes in ranges library:
    • Refined definition of a view.
    • Replacing function template
      std::ranges::istream_view
      with alias templates
      std::ranges::istream_view
      ,
      std::ranges::wistream_view
      , and customization point object
      std::views::istream
      .
    • zip
      range adaptor family:
      • zip_view
      • zip_transform_view
      • adjacent_view
        (and
        std::views::pairwise
        being equivalent to
        std::views::adjacent<2>
        )
      • adjacent_transform_view
        (and
        std::views::pairwise_transform
        being equivalent to
        std::views::adjacent_transform<2>
        )
  • std::move_only_function
    .
  • Monadic operations for
    std::optional
    .
  • Member function template
    std::basic_string::resize_and_overwrite
    .
  • Printing volatile pointers (
    volatile T*
    ).
  • std::byteswap
    .
  • Heterogeneous erasure overloads for associative containers.
  • Every specialization of
    std::span
    and
    std::basic_string_view
    is trivially copyable.
  • Adding conditional
    noexcept
    specifications to
    std::exchange
    .[149]
  • Revamped specification and use of integer-class types.[150]
  • Clarify C headers. "The headers are not useful in code that is only required to be valid C++. Therefore, the C headers should be provided by the C++ standard library as a fully-supported, not deprecated part, but they should also be discouraged for use in code that is not polyglot interoperability code. [..] This proposal makes the C headers no longer deprecated, so there is no formal threat of future removal. The effective discouragement to use the C headers in pure C++ code is now spelled out explicitly as normative discouragement."[151]

After the virtual WG21 meeting of 7 February 2022, the following features are added where they were approved by straw polls:[152]

  • Allowed attributes on the function call operator of a lambda
  • std::expected
  • constexpr
    for cmath and cstdlib
  • Function to mark unreachable code
  • ranges::to
  • A type trait to detect reference binding to temporary
  • Making
    std::unique_ptr
    constexpr
  • Pipe support for user-defined range adaptors
  • ranges::iota
    ,
    ranges::shift_left
    and
    ranges::shift_right
  • views::join_with
  • Windowing range adaptors:
    views::chunk
    and
    views::slide
  • views::chunk_by

After the virtual WG21 meeting of 25 July 2022, the following features and defect reports are added where they were approved by straw polls:[153]

  • Made rewriting equality in expressions less of a breaking change.
  • Reverted the deprecation of bitwise assignment to
    volatile
    variables.
  • Added the
    #warning
    preprocessor directive.
  • Removed non-encodable wide character literals and multicharacter wide character literals.
  • Allowed labels to appear at the end of compound statements.
  • Added escape sequences delimited with curly braces for octal and hexadecimal numbers and universal character names.
  • Allowed
    constexpr
    functions to never be constant expressions.
  • Simplified some implicit move rules from C++20 and allowed implicit move when returning an rvalue reference.
  • Add a way to specify unicode characters by name. For example,
    U'\N{LATIN CAPITAL LETTER A WITH MACRON}' // Equivalent to U'\u0100'
  • Allowed operator() and lambdas to be static.
  • Allowed the this pointer and references of unknown origin to appear in constant expressions.
  • Allowed implementations to define extended floating-point types in addition to the three standard floating-point types. Added the type aliases std::float16_t, std::float32_t, std::float64_t, std::float128_t, std::bfloat16 t for these extended types accessible through the header <stdfloat>, their corresponding literal suffixes f16 f32 f64 f128 bf16or F16 F32 F64 F128 BF16 and added overloads to various standard library functions that take floats as arguments.
  • Added the
    assume(expression)
    attribute which allows the compiler to assume the provided expression is true to allow optimizations.
  • Made support for UTF-8 source files mandatory, providing a portable encoding for source files.
  • Allowed arrays of
    char
    and
    unsigned char
    to be initialized with UTF-8 string literals.
  • Removed the requirement that wchar t can encode all characters of the extended character set, in effect allowing UTF-16 to be used for wide string literals.
  • Added std::mdspan, a multidimensional array view analogous to std::span.
  • flat_map
    and
    flat_set
    were added to the standard library.
  • Added the
    std::print
    and
    std::println
    functions for printing formatted text to stdout.
  • Provide the named modules
    std
    and
    std.compat
    for importing the standard library.
  • Added support for exclusive mode fstreams, analogous to the "x" flag in fopen.
  • Allowed std::format to handle ranges, tuples, and other containers.
  • Added std::forward_like.
  • Made std::string::substr use move semantics.
  • Added
    std::generator
    which implements a coroutine generator that models
    std::ranges::input_range
  • views::cartesian_product
    ,
    views::repeat
    ,
    views::stride
    ,
    views::as_const
    ,
    views::as_rvalue
    .
  • Added new algorithms:
    ranges::find_last
    ,
    ranges::contains
    , and ranges fold algorithms.
  • Made std::tuple compatible with other tuple-like objects.
  • Explicit lifetime management for implicit-lifetime types.
  • Made std::bitset and integral overloads of std::to_chars and std::from_chars
    constexpr
    -compatible.
  • Adding move-only types support for comparison concepts.
  • Ranges iterators as inputs to non-ranges algorithms.
  • Relaxing range adaptors to allow for move-only types.

After the hybrid WG21 meeting of 7 November 2022, the following features and defect reports are added where they were approved by straw polls:[154]

  • Allowed
    operator[]
    to be
    static
    .
  • Allowed
    static
    and thread local variables to appear in
    constexpr
    functions if they are usable in constant expressions.
  • consteval propagates upwards, that is, certain existing
    constexpr
    functions become
    consteval
    functions when those functions can already only be invoked during compile time.
  • Extended the lifetime of temporaries that appear in the for-range-initializer of a range-based
    for
    loop to cover the entire loop.
  • Reverted the deprecation of (all, not just bitwise) compound assignment to
    volatile
    variables.
  • Monadic functions for
    std::expected
    .
  • Synchronize the output of
    std::print
    with the underlying stream if the native Unicode API is used.[155]

After the final hybrid WG21 meeting of 6-11 February 2023, the following features and defect reports are added where they were approved by straw polls:[156]

  • Referencing the Unicode Standard.[157]
  • Stashing stashing iterators for proper flattening.[158]
  • views::enumerate
  • making multi-param constructors of views explicit
  • relaxing ranges just a smidge
  • escaping improvements in std::format
  • improving std::format's width estimation
  • std::format fill character allowances
  • formatting thread::id and stacktrace
  • A type trait std::is_implicit_lifetime
  • std::common_reference_t of std::reference_wrapper should be a reference type
  • disallowing user specialization of std::allocator_traits
  • std::pmr::generator
  • deprecating std::numeric_limits::has_denorm
  • std::barrier's phase completion guarantees

References

  1. "Working Draft, Standard for Programming Language C++". 2023-05-10. https://open-std.org/JTC1/SC22/WG21/docs/papers/2023/n4950.pdf. 
  2. "N4951 Editors' Report: Programming Languages - C++". 2023-05-10. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4951.html. 
  3. Dusíková, Hana (2019-11-06). "N4817: 2020 Prague Meeting Invitation and Information". http://open-std.org/JTC1/SC22/WG21/docs/papers/2019/n4817.pdf. 
  4. Voutilainen, Ville (2019-11-25). "To boldly suggest an overall plan for C++23". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0592r4.html. 
  5. "P2145R0: Evolving C++ Remotely". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2145r0.html. 
  6. 6.0 6.1 Sutter, Herb (29 July 2020). "Business Plan and Convener's Report: ISO/IEC JTC1/SC22/WG21 (C++)". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4862.pdf. 
  7. 7.0 7.1 7.2 "Upcoming Meetings, Past Meetings : Standard C++". https://isocpp.org/std/meetings-and-participation/upcoming-meetings. 
  8. "C++23 "Pandemic Edition" is complete (Trip report: Winter ISO C++ standards meeting, Issaquah, WA, USA)". 13 February 2023. https://herbsutter.com/2023/02/13/c23-pandemic-edition-is-complete-trip-report-winter-iso-c-standards-meeting-issaquah-wa-usa/. 
  9. "Deducing this". 2021-07-12. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7.html. 
  10. "if consteval". 2021-03-22. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1938r3.html. 
  11. "Multidimensional subscript operator". 2021-09-14. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2128r6.pdf. 
  12. "static operator()". 2022-04-08. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1169r4.html. 
  13. "static operator["]. 2022-11-11. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2589r1.pdf. 
  14. "Simpler implicit move". 2022-03-23. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2266r3.html. 
  15. Zhihao Yuan (2021-07-12). "auto(x): decay-copy in the language". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0849r8.html. 
  16. Melanie Blower (2021-04-30). "Add support for preprocessing directives elifdef and elifndef". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2334r1.pdf. 
  17. Aaron Ballman (2022-01-13). "Support for #warning". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2437r1.pdf. 
  18. "Wording for P2644R1 Fix for Range-based for Loop". 2022-11-11. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2718r0.html. 
  19. "Portable assumptions". 2022-04-22. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1774r8.pdf. 
  20. Timur Doumler (2022-05-20). "Wording for class template argument deduction from inherited constructors". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2582r1.pdf. 
  21. "Labels at the end of compound statements (C compatibility)". 2022-01-13. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2324r2.pdf. 
  22. Jens Maurer (2021-04-13). "Extend init-statement to allow alias-declaration". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2360r0.html. 
  23. "Literal Suffix for (signed) size_t". 2019-11-24. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0330r8.html. 
  24. "Extended floating-point types and standard names". 2022-04-22. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1467r9.html. 
  25. Alex Christensen; JF Bastien (2020-12-11). "P1102R2: Down with ()!". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1102r2.html. 
  26. "Attributes on Lambda-Expressions". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2173r1.pdf. 
  27. Ville Voutilainen (2021-07-12). "Non-literal variables (and labels and gotos) in constexpr functions". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2242r3.html. 
  28. "Permitting static constexpr variables in constexpr functions". 2022-11-07. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2647r1.html. 
  29. "Relaxing some constexpr restrictions". 2022-01-27. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2448r2.html. 
  30. Andrzej Krzemieński (2021-04-12). "Narrowing contextual conversions to bool". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1401r5.html. 
  31. Corentin Jabot (2021-04-13). "Trimming whitespaces before line splicing". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2223r2.pdf. 
  32. "Make declaration order layout mandated". 2021-04-02. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1847r4.pdf. 
  33. "Delimited escape sequences". 2022-02-25. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2290r3.pdf. 
  34. "Named universal character escapes". 2022-03-25. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2071r2.html. 
  35. "Support for UTF-8 as a portable source file encoding". 2022-07-01. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2295r6.pdf. 
  36. Corentin Jabot (2021-09-14). "Consistent character literal encoding". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2316r2.pdf. 
  37. Jens Maurer (2021-09-21). "Character sets and encodings". https://isocpp.org/files/papers/P2314R4.html. 
  38. "Standard Library Modules std and std.compat". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2465r3.pdf. 
  39. "(std::generator: Synchronous Coroutine Generator for Ranges)". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2502r2.pdf. 
  40. "std::expected". 2022-01-07. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0323r12.html. 
  41. Sy Brand (2021-04-27). "Monadic operations for std::optional". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0798r6.html. 
  42. Jeff Garland (2022-09-28). "P2505R5 Monadic Functions for std::expected". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2505r5.html. 
  43. JeanHeyd Meneide (2021-01-22). "std::to_underlying for enumerations". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1682r3.html. 
  44. "move_only_function". 2021-07-09. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0288r9.html. 
  45. Gašper Ažman (2022-05-13). "std::forward_like". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2445r1.pdf. 
  46. Zhihao Yuan (2020-04-29). "invoke_r". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2136r3.html. 
  47. 47.0 47.1 Barry Revzin (2021-12-17). "Pipe support for user-defined range adaptors". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2387r3.html. 
  48. "Byteswapping for fun&&nuf". 2021-09-17. https://isocpp.org/files/papers/P1272R4.html. 
  49. "Function to mark unreachable code". 2021-10-15. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0627r6.pdf. 
  50. Corentin Jabot (2022-07-15). "Compatibility between tuple, pair and tuple-like objects". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2165r4.pdf. 
  51. "common_reference_t of reference_wrapper Should Be a Reference Type". 2023-02-07. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2655r3.html. 
  52. "Wording for P2644R1 Fix for Range-based for Loop". 2022-11-11. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2718r0.html. 
  53. Peter Dimov (2021-05-01). "Making std::type_info::operator== constexpr". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1328r1.html. 
  54. Daniil Goncharov (2022-06-25). "A more constexpr bitset". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2417r2.pdf. 
  55. Andreas Fertig (2021-11-06). "Making std::unique_ptr constexpr". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2273r3.pdf. 
  56. "constexpr for <cmath> and <cstdlib>". 2021-11-12. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0533r9.pdf. 
  57. "Add Constexpr Modifiers to Functions to_chars and from_chars for Integral Types in <charconv> Header". 2021-09-18. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2291r3.pdf. 
  58. Juan Alday (2020-10-12). "A proposal for a type trait to detect scoped enumerations". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1048r1.pdf. 
  59. "A trait for implicit lifetime types". 2022-11-11. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2674r1.pdf. 
  60. Tim Song (2021-10-13). "A type trait to detect reference binding to temporary". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2255r2.html. 
  61. Justin Bassett (2022-07-02). "Move-only types for equality_comparable_with, totally_ordered_with, and three_way_comparable_with". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2404r3.pdf. 
  62. 62.0 62.1 "Conversions from ranges to containers". 2022-01-21. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1206r7.pdf. 
  63. Christopher Di Bella (2021-02-19). "starts_with and ends_with". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1659r3.html. 
  64. Christopher Di Bella (2021-04-16). "std::ranges::contains". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2302r4.html. 
  65. Zach Laine (2022-06-17). "find_last". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1223r5.pdf. 
  66. Tim Song (2021-12-05). "ranges::iota, ranges::shift_left, and ranges::shift_right". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2440r1.html. 
  67. Barry Revzin (2022-04-22). "ranges::fold". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2322r6.html. 
  68. Tim Song (2021-06-11). "zip". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2321r2.html. 
  69. Barry Revzin (2022-01-28). "views::join_with". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2441r2.html. 
  70. Tim Song (2021-12-05). "Windowing range adaptors: views::chunk and views::slide". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2442r1.html. 
  71. Tim Song (2021-11-19). "views::chunk_by". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2443r1.html. 
  72. Barry Revzin (2022-02-14). "views::as_rvalue". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2446r2.html. 
  73. 73.0 73.1 Barry Revzin (2022-06-17). "cbegin should always return a constant iterator". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html. 
  74. Michał Dominiak (2022-07-13). "views::repeat". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2474r2.html. 
  75. "stride_view". 2022-07-08. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1899r3.html. 
  76. "views::cartesian_product". 2022-07-13. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2374r4.html. 
  77. Corentin Jabot (2022-12-07). "views::enumerate". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2164r9.pdf. 
  78. David Olsen (2022-04-22). "Ranges iterators as inputs to non-Ranges algorithms". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2408r5.html. 
  79. Michał Dominiak (2022-07-13). "Relaxing range adaptors to allow for move only types". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2494r2.html. 
  80. Ville Voutilainen (2022-11-12). "Making multi-param constructors of views explicit". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2711r1.html. 
  81. "out_ptr - a scalable output pointer abstraction". 2021-04-15. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1132r7.html. 
  82. "Providing size feedback in the Allocator interface". 2021-01-22. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0401r6.html. 
  83. "Explicit lifetime management". 2022-07-15. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2590r2.pdf. 
  84. Pablo Halpern (2023-02-08). "Disallow User Specialization of allocator_traits". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2652r2.html. 
  85. "string contains function". 2020-06-13. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1679r3.html. 
  86. Yuriy Chernyshov (2020-09-06). "A Proposal to Prohibit std::basic_string and std::basic_string_view construction from nullptr.". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2166r1.html. 
  87. Corentin Jabot (2021-03-17). "Range constructor forstd::string_view 2: Constrain Harder". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1989r2.pdf. 
  88. "basic_string::resize_and_overwrite". 2021-09-14. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1072r10.html. 
  89. "std::string::substr() &&". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2438r2.html. 
  90. "Formatting Ranges". 16 May 2022. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2286r8.html. 
  91. Barry Revzin (2022-07-15). "Improve default container formatting". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2585r1.html. 
  92. "Formatting thread::id and stacktrace". 2023-02-09. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2693r1.pdf. 
  93. "A Proposal to add stacktrace library". 2020-09-16. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0881r7.html. 
  94. "Formatted output". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2093r14.html. 
  95. Peter Sommerlad (2021-02-26). "A strstream replacement using span<charT> as buffer". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0448r4.pdf. 
  96. "Support exclusive mode for fstreams". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2467r1.html. 
  97. Bryce Adelstein Lelbach (2021-09-25). "Printing volatile Pointers". https://isocpp.org/files/papers/P1147R1.html. 
  98. "MDSPAN". 13 July 2022. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0009r18.html. 
  99. "index_type & size_type in mdspan". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2599r2.pdf. 
  100. "mdspan: rename pointer and contiguous". 15 June 2022. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2604r0.html. 
  101. "Add the missing empty to mdspan". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2613r1.html. 
  102. "A Standard flat_map". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf. 
  103. "A Standard flat_set". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1222r4.pdf. 
  104. "Stop overconstraining allocators in container deduction guides". 2021-03-14. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1518r2.html. 
  105. "Heterogeneous erasure overloads for associative containers". 2020-12-15. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2077r2.html. 
  106. Corentin Jabot (2021-03-05). "Iterators pair constructors for stack and queue". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1425r4.pdf. 
  107. Nevin Liber (2021-03-19). "Require span & basic_string_view to be TriviallyCopyable". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2251r1.pdf. 
  108. Hans-J. Boehm (2020-10-23). "P0943R6: Support C atomics in C++". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0943r6.html. 
  109. "C++ Identifier Syntax using Unicode Standard Annex 31". 2021-04-12. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1949r7.html. 
  110. Erich Keane (2020-07-02). "Allow Duplicate Attributes". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2156r1.pdf. 
  111. Barry Revzin (2021-09-14). "Change scope of lambda trailing-return-type". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2036r3.html. 
  112. "The Equality Operator You Are Looking For". 2022-01-13. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2468r2.html. 
  113. "De-deprecating volatile compound operations". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2327r1.pdf. 
  114. "Core Language Working Group NB comment resolutions for the November, 2022 meeting : 2654. Un-deprecation of compound volatile assignments". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2710r0.html#2654. 
  115. "char8_t Compatibility and Portability Fix". 2022-06-17. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2513r3.html. 
  116. "Relax requirements on wchar_t to match existing practices". 2022-07-15. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2460r2.pdf. 
  117. "Using unknown pointers and references in constant expressions". 8 April 2022. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2280r4.html. 
  118. "consteval needs to propagate up". 2022-11-11. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2564r3.html. 
  119. Barry Revzin (2020-02-19). "Conditionally borrowed ranges". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2017r1.html. 
  120. Tim Song (2021-01-12). "Repairing input range adaptors and counted_iterator". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2259r1.html. 
  121. Tim Song (2021-05-06). "join_view should join all views of ranges". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2328r1.html. 
  122. Barry Revzin (2021-03-05). "Superior String Splitting". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2210r2.html. 
  123. Barry Revzin (2021-05-14). "Views should not be required to be default constructible". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2325r3.html. 
  124. "What is a view?". 2021-08-15. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2415r1.html. 
  125. Nicolai Josuttis (2021-09-24). "Fix istream_view". https://isocpp.org/files/papers/P2432R1.pdf. 
  126. Barry Revzin (2022-01-18). "Expose std::basic-format-string<charT, Args...>". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2508r1.html. 
  127. Victor Zverovich (2021-02-05). "std::format improvements". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2216r3.html. 
  128. "Fixing locale handling in chrono formatters". 2021-09-11. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2372r3.html. 
  129. Corentin Jabot (2022-12-02). "format's width estimation is too approximate and not forward compatible". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2675r1.pdf. 
  130. Tom Honermann (2023-02-08). "std::format() fill character allowances". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2572r1.html. 
  131. Victor Zverovich (2021-09-24). "Add support for std::generator-like types to std::format". https://isocpp.org/files/papers/P2418R2.html. 
  132. Barry Revzin (2021-02-11). "Missing constexpr in std::optional and std::variant". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2231r1.html. 
  133. Barry Revzin (2020-10-30). "Inheriting from std::variant". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2162r2.html. 
  134. "Removing Garbage Collection Support". 2021-04-16. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2186r2.html. 
  135. Jens Maurer (2021-04-12). "Mixed string literal concatenation". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2201r1.html. 
  136. "Remove non-encodable wide character literals and multicharacter wide character literals". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2362r3.pdf. 
  137. CJ Johnson (2021-11-22). "Deprecate std::aligned_storage and std::aligned_union". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1413r3.pdf. 
  138. Matthias Kretz (2022-11-08). "Deprecate numeric_limits::has_denorm". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2614r2.pdf. 
  139. "Programming Languages — Technical specification for C++ extensions for concurrency 2". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4956.pdf. 
  140. "C++ Standards Support in GCC - GNU Project". https://gcc.gnu.org/projects/cxx-status.html. 
  141. Ranns, Nina (2020-11-19). "WG21 2020-11 Virtual Meeting: Minutes of Meeting". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4877.pdf. 
  142. Ranns, Nina (2021-02-22). "WG21 2021-02 Virtual Meeting: Minutes of Meeting". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4877.pdf. 
  143. "Relax Requirements for time_point::clock". 2020-10-22. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2212r2.html. 
  144. Tim Song (2020-11-13). "Locks lock lockables". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2160r1.html. 
  145. Ranns, Nina (2021-06-07). "WG21 2021-06 Virtual Meeting Minutes of Meeting". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/n4891.pdf. 
  146. Ranns, Nina (2021-10-04). "WG21 2021-10 Virtual Meeting Minutes of Meeting". https://isocpp.org/files/papers/N4898.pdf. 
  147. "GCC 12 Adds Support For New #elifdef #elifndef Directives". May 12, 2021. https://www.phoronix.com/news/GCC-12-elifdef-elifndef. 
  148. Steve Downey (2021-06-14). "Add a pmr alias for std::stacktrace". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2301r1.html. 
  149. Giuseppe D'Angelo (2021-06-28). "Add a conditional noexcept specification to std::exchange". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2401r0.html. 
  150. Tim Song (2021-08-06). "Cleaning up integer-class types". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2393r1.html. 
  151. Thomas Köppe (2021-06-11). "Clarifying the status of the "C headers"". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2340r1.html. 
  152. Ranns, Nina (2022-02-07). "WG21 2022-02 Virtual Meeting: Minutes of Meeting". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4907.pdf. 
  153. Ranns, Nina (2022-08-09). "WG21 2022-07 Virtual Meeting: Minutes of Meeting". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4916.pdf. 
  154. Ranns, Nina (2022-12-05). "WG21 2022-11 Hybrid Meeting: Minutes of Meeting". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4933.pdf. 
  155. Victor Zverovich (2022-11-08). "Should the output of std::print to a terminal be synchronized with the underlying stream?". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2539r4.html. 
  156. Ranns, Nina (2023-03-06). "WG21 2023-02 Hybrid Meeting: Minutes of Meeting". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4943.pdf. 
  157. Corentin Jabot (2023-02-09). "Referencing The Unicode Standard". https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2736r2.pdf. 
  158. "Stashing stashing iterators for proper flattening". 2023-01-31. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2770r0.html.