Английская Википедия:C++23

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Short description Шаблон:Multiple issues

Шаблон:C++ language revisions 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[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]

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

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

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

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

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 Шаблон:Cpp variables.
  • Added the Шаблон:Cpp 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 Шаблон:Cpp 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, Шаблон:Cpp
  • Allowed [[operators in C and C++|Шаблон:Code]] and lambdas to be [[static (keyword)|Шаблон:Code]].
  • 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 Шаблон:Cpp 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 Шаблон:Cpp and Шаблон:Cpp to be initialized with UTF-8 string literals.
  • Removed the requirement that [[wchar_t|Шаблон:Code]] 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.
  • Шаблон:Cpp and Шаблон:Cpp were added to the standard library.
  • Added the Шаблон:Cpp and Шаблон:Cpp functions for printing formatted text to stdout.
  • Provide the named modules Шаблон:Cpp and Шаблон:Cpp 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 Шаблон:Cpp which implements a coroutine generator that models Шаблон:Cpp
  • Шаблон:Cpp, Шаблон:Cpp, Шаблон:Cpp, Шаблон:Cpp, Шаблон:Cpp.
  • Added new algorithms: Шаблон:Cpp, Шаблон:Cpp, 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 Шаблон:Cpp-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]

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

Шаблон:Reflist

Шаблон:C++ programming language

  1. Шаблон:Cite web
  2. Шаблон:Cite web
  3. Шаблон:Cite web
  4. Шаблон:Cite web
  5. Шаблон:Cite web
  6. 6,0 6,1 Шаблон:Cite web
  7. 7,0 7,1 7,2 Шаблон:Cite web
  8. Шаблон:Cite web
  9. Шаблон:Cite web
  10. Шаблон:Cite web
  11. Шаблон:Cite web
  12. Шаблон:Cite web
  13. Шаблон:Cite web
  14. Шаблон:Cite web
  15. Шаблон:Cite web
  16. Шаблон:Cite web
  17. Шаблон:Cite web
  18. Шаблон:Cite web
  19. Шаблон:Cite web
  20. Шаблон:Cite web
  21. Шаблон:Cite web
  22. Шаблон:Cite web
  23. Шаблон:Cite web
  24. Шаблон:Cite web
  25. Шаблон:Cite web
  26. Шаблон:Cite web
  27. Шаблон:Cite web
  28. Шаблон:Cite web
  29. Шаблон:Cite web
  30. Шаблон:Cite web
  31. Шаблон:Cite web
  32. Шаблон:Cite web
  33. Шаблон:Cite web
  34. Шаблон:Cite web
  35. Шаблон:Cite web
  36. Шаблон:Cite web
  37. Шаблон:Cite web
  38. Шаблон:Cite web
  39. Шаблон:Cite web
  40. Шаблон:Cite web
  41. Шаблон:Cite web
  42. Шаблон:Cite web
  43. Шаблон:Cite web
  44. Шаблон:Cite web
  45. Шаблон:Cite web
  46. Шаблон:Cite web
  47. 47,0 47,1 Шаблон:Cite web
  48. Шаблон:Cite web
  49. Шаблон:Cite web
  50. Шаблон:Cite web
  51. Шаблон:Cite web
  52. Шаблон:Cite web
  53. Шаблон:Cite web
  54. Шаблон:Cite web
  55. Шаблон:Cite web
  56. Шаблон:Cite web
  57. Шаблон:Cite web
  58. Шаблон:Cite web
  59. Шаблон:Cite web
  60. Шаблон:Cite web
  61. Шаблон:Cite web
  62. 62,0 62,1 Шаблон:Cite web
  63. Шаблон:Cite web
  64. Шаблон:Cite web
  65. Шаблон:Cite web
  66. Шаблон:Cite web
  67. Шаблон:Cite web
  68. Шаблон:Cite web
  69. Шаблон:Cite web
  70. Шаблон:Cite web
  71. Шаблон:Cite web
  72. Шаблон:Cite web
  73. 73,0 73,1 Шаблон:Cite web
  74. Шаблон:Cite web
  75. Шаблон:Cite web
  76. Шаблон:Cite web
  77. Шаблон:Cite web
  78. Шаблон:Cite web
  79. Шаблон:Cite web
  80. Шаблон:Cite web
  81. Шаблон:Cite web
  82. Шаблон:Cite web
  83. Шаблон:Cite web
  84. Шаблон:Cite web
  85. Шаблон:Cite web
  86. Шаблон:Cite web
  87. Шаблон:Cite web
  88. Шаблон:Cite web
  89. Шаблон:Cite web
  90. Шаблон:Cite web
  91. Шаблон:Cite web
  92. Шаблон:Cite web
  93. Шаблон:Cite web
  94. Шаблон:Cite web
  95. Шаблон:Cite web
  96. Шаблон:Cite web
  97. Шаблон:Cite web
  98. Шаблон:Cite web
  99. Шаблон:Cite web
  100. Шаблон:Cite web
  101. Шаблон:Cite web
  102. Шаблон:Cite web
  103. Шаблон:Cite web
  104. Шаблон:Cite web
  105. Шаблон:Cite web
  106. Шаблон:Cite web
  107. Шаблон:Cite web
  108. Шаблон:Cite web
  109. Шаблон:Cite web
  110. Шаблон:Cite web
  111. Шаблон:Cite web
  112. Шаблон:Cite web
  113. Шаблон:Cite web
  114. Шаблон:Cite web
  115. Шаблон:Cite web
  116. Шаблон:Cite web
  117. Шаблон:Cite web
  118. Шаблон:Cite web
  119. Шаблон:Cite web
  120. Шаблон:Cite web
  121. Шаблон:Cite web
  122. Шаблон:Cite web
  123. Шаблон:Cite web
  124. Шаблон:Cite web
  125. Шаблон:Cite web
  126. Шаблон:Cite web
  127. Шаблон:Cite web
  128. Шаблон:Cite web
  129. Шаблон:Cite web
  130. Шаблон:Cite web
  131. Шаблон:Cite web
  132. Шаблон:Cite web
  133. Шаблон:Cite web
  134. Шаблон:Cite web
  135. Шаблон:Cite web
  136. Шаблон:Cite web
  137. Шаблон:Cite web
  138. Шаблон:Cite web
  139. Шаблон:Cite web
  140. Шаблон:Cite web
  141. Шаблон:Cite web
  142. Шаблон:Cite web
  143. Шаблон:Cite web
  144. Шаблон:Cite web
  145. Шаблон:Cite web
  146. Шаблон:Cite web
  147. Шаблон:Cite web
  148. Шаблон:Cite web
  149. Шаблон:Cite web
  150. Шаблон:Cite web
  151. Шаблон:Cite web
  152. Шаблон:Cite web
  153. Шаблон:Cite web
  154. Шаблон:Cite web
  155. Шаблон:Cite web
  156. Шаблон:Cite web
  157. Шаблон:Cite web
  158. Шаблон:Cite web