C++23
C++23, formally ISO/IEC 14882:2024, is the current open standard for the C++ programming language, published in 2024. It follows C++20, and precedes C++26. The final draft of this version is N4950, which was technically finalized by WG21 in February 2023.
Modern "Hello, world" Example
After many library changes applied to the working draft, the new "Hello, world" program will be:import std;
int main
Features
Changes that have been accepted into C++23 include:Language
- explicit
thisobject parameter if consteval- multidimensional subscript operator
- static call and subscript operators and static lambdas
- simplifying implicit move
autoandauto- new preprocessor directives:
- *
#elifdefand#elifndef - *
#warning - extending the lifetime of some temporaries in range-based for loop
- new standard attribute
assume(expression) - class template argument deduction from inherited constructors
- labels at the end of the compound statement
- alias declarations in init-statements
- literal suffixes for
size_tand the corresponding signed type: - extended floating-point types with literals
- optional
from nullary lambda expressions - attributes on lambda expressions
constexprchanges:- *non-literal variables, labels, and
gotos inconstexprfunctions - *allowing
staticandthread_localvariables that are usable in constant expressions inconstexprfunctions - *
constexprfunction does not need its return type and parameter types to be literal type - *it is now possible to write a
constexprfunction for which no invocation satisfies the requirements of a core constant expression - narrowing contextual conversions to
boolinstatic_assertandif constexpr - trimming whitespaces before line splicing
- make declaration order layout mandated
- delimited escape sequences
- named universal character escapes
- text encoding changes:
- *support for UTF-8 as a portable source file encoding
- *consistent character literal encoding
- *character sets and encodings
- New meaning added to some keywords, such as for
this.
Library
Standard Library Module Support
- standard library modules
stdandstd.compat
Coroutine Library Support
- synchronous coroutine
std::generatorfor ranges
General Utilities Support
- result type
std::expected - monadic operations for
std::optionalandstd::expected - utility function
std::to_underlyingto get the underlying value of enum - move-only callable wrapper
std::move_only_function std::forward_likestd::invoke_rstd::bind_backstd::byteswapstd::unreachable: a function to mark unreachable code- made
std::tuplecompatible with other tuple-like objects std::basic_common_referencespecialization forstd::reference_wrapperyielding reference types- adding default arguments for
std::pair's forwarding constructor
Compile-time Support
constexprsupport for:- *
std::type_info::operator - *
std::bitset - *
std::unique_ptr - * for some
functions - * for integral overloads of
std::to_charsandstd::from_chars - metaprogramming utilities:
- *type traits
std::is_scoped_enum,std::is_implicit_lifetime,std::reference_constructs_from_temporary, andstd::reference_converts_from_temporary. - adding move-only types support for comparison concepts
Iterators, Ranges, and Algorithm Support
- new range conversion function
std::ranges::to - new constrained ranges algorithm:
- *
std::ranges::starts_with - *
std::ranges::ends_with - *
std::ranges::contains - *
std::ranges::contains_subrange - *
std::ranges::find_lastand other variants - *rangified versions of
iota,shift_left, andshift_right - *range fold algorithms
- new
std::ranges::range_adaptor_closure, a helper for defining user-defined range adaptor closures - new range adaptors:
- *
std::views::zipand other variants - *
std::views::adjacentand other variants - *
std::views::join_with - *
std::views::slide - *
std::views::chunk - *
std::views::chunk_by - *
std::views::as_rvalue - *
std::views::as_const - *
std::views::repeat - *
std::views::stride - *
std::views::cartesian_product - *
std::views::enumerate - rectifying constant iterators, sentinels, and ranges, that is,
std::ranges::cbeginand other similar utilities returning constant iterators should be fully guaranteed even for shallow-const views - ranges iterators as inputs to non-ranges algorithms
- relaxing range adaptors to allow for move only types
- making multi-param constructors of some views
explicit
Memory Management Support
std::out_ptrandstd::inout_ptrfor C interoperabilitystd::allocate_at_leastandstd::allocator::allocate_at_least- explicit lifetime management function
std::start_lifetime_asfor implicit-lifetime types - disallowing user specialization of
std::allocator_traits
String and Text Processing Support
- new member functions and changes in string types:
- *
std::basic_string_view::containsandstd::basic_string::contains - *disabling construction from
nullptrforstd::basic_stringandstd::basic_string_view - *explicit range constructor for
std::basic_string_view - *
std::basic_string::resize_and_overwrite - *rvalue reference overload of
std::basic_string::substrfor efficient slicing - formatting ranges, tuples, escaped presentation of characters and strings,
std::thread::id, and stacktraces.
Diagnostic Support
- stacktrace library, header
and classstd::stacktrace
I/O Support
- formatted output functions
std::printandstd::printlnfrom new header - spanstream library from new header
- a support for exclusive mode in
std::fstreams
Containers Support
- multidimensional-span
std::mdspan - constructability and assignability of containers from other compatible ranges
- flat set and flat map container adapters
- non-deduction context for allocators in container deduction guides
- heterogeneous erasure overloads for associative containers
- allowing iterator pair construction in stack and queue
- requiring
std::spanandstd::basic_string_viewto be trivially copyable
C-Compatibility Support
- new header
Language defect reports
- C++ identifier syntax using Unicode Standard Annex 31
- allowing duplicate attributes
- changing scope of lambda trailing return type
- making overloaded comparison operators less breaking change
- undeprecating volatile compound assignments
- fixing the compatibility and portability of
char8_t - relaxing requirements on
wchar_tto match existing practices - allowing some pointers and references of
thisor unknown origin in constant expressions - introduction of immediate-escalating functions promoted to immediate functions
- allowing
static_assertin uninstantiated template contexts
Library defect reports
- changes in ranges library:
- *conditionally borrowed ranges
- *repairing input range adaptors and
std::counted_iterator - *relaxing the constraint on
std::ranges::join_view - *renamed
std::ranges::split_viewtostd::ranges::lazy_split_viewand newsplit_view - *removed
std::default_initializableconstraint from conceptstd::ranges::view - *view with ownership and new
std::ranges::owning_view - *fixed
std::ranges::istream_view - changes in text formatting library:
- *
std::basic_format_string - *compile-time format string checks
- *reducing binary code size of
std::format_to - *fixing locale handling in chrono formatters
- *improving width estimation and fill character allowances of
std::format - *use of forwarding references in format arguments to allow non-const-formattable types
- fully
constexprstd::variantandstd::optional - supporting types derived from
std::variantinstd::visit
Removed features and deprecation
Removed features:- Garbage Collection Support and Pointer Safety. This minimal garbage collection support, was added to C++11 but no compilers have ever supported it so the support was removed in C++23. However, that doesn't mean many GC implementations haven't been used, and continue to be used with C++, such as Boehm GC, and such GC is often implemented in C++, for other languages to use.
- Mixed wide-string literal concatenation.
- Non-encodable wide character literals and multicharacter wide character literals.
std::aligned_storageandstd::aligned_unionstd::numeric_limits::has_denorm
- 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
Published as Technical Specifications
- Concurrency TS v2
Compiler support
- Clang progressively added partial C++23 support from 2021 in version 13 through to version 18 in 2024, available through the option
-std=c++23. - GCC added partial, experimental C++23 support in 2021 in version 11 through the option
-std=c++2bor-std=c++23It also has an option to enable GNU extensions in addition to the experimental C++23 support,-std=gnu++2b.
History
In February 2020, at the final meeting for C++20 in Prague, an overall plan for C++23 was adopted: 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, as was the November 2020 meeting in New York and the February 2021 meeting in Kona, Hawaii. All meetings until November 2022 were virtual while the November 2022 meeting until the final meeting in February 2023 was hybrid. The standard was technically finalized by WG21 at the hybrid meeting in Issaquah in February 2023.
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.
November 2020
The following were added after the virtual WG21 meeting of 9 November 2020, where they were approved by straw polls:- Literal suffixes for
std::size_tand the corresponding signed type - A member function for and, to check whether or not the string contains a given substring or character
- A stacktrace library, based on Boost.Stacktrace
- A type trait
- The header, for interoperability with C atomics
February 2021
After the virtual WG21 meeting of 22 February 2021, following features are added where they were approved by straw polls:- Removing unnecessary empty parameter list from lambda expressions.
- Repairing input range adaptors and.
- Relax the requirements for.
- for classes that are derived from.
- .
- Conditionally borrowed ranges.
- .
June 2021
After the summer 2021 ISO C++ standards plenary virtual meeting of June 2021, new features and defect reports were approved by straw polls:- Consteval if.
- Narrowing contextual conversions to.
- Allowing duplicate attributes.
- -based string-stream.
- and.
- [constexpr|] for,, and.
- Iterators pair constructors for and .
- Few changes of the ranges library:
- * Generalized and for arbitrary ranges.
- * Renamed to and new.
- * Relaxing the constraint on.
- * Removing constraint from concept.
- * Range constructor for.
- Prohibiting and construction from [nullptr|].
- .
- Improvements on.
- Adding default arguments for 's forwarding constructor.
October 2021
After the autumn 2021 ISO C++ standards plenary virtual meeting of October 2021, new features and defect reports were approved by straw polls:- Non-literal variables, labels, and gotos in functions, but still ill-formed to evaluate them at compile-time.
- Explicit [this (computer programming)|] object parameter.
- Changes on character sets and encodings.
- New preprocessors: and. Both directives were added to C23 and GCC 12.
- Allowing alias declarations in init-statement.
- Overloading multidimensional subscript operator.
- Decay copy in language: or.
- Changes in text formatting library:
- * Fixing locale handling in chrono formatters.
- * Use of forwarding references in format arguments to allow -like types.
- Addition of type alias which is equivalent to.
- Changes in ranges library:
- * Refined definition of a view.
- * Replacing function template with alias templates,, and customization point object.
- * range adaptor family:
- **
- **
- **
- **
- .
- Monadic operations for.
- Member function template.
- Printing [volatile (computer programming)|] pointers.
- .
- Heterogeneous erasure overloads for associative containers.
- Every specialization of and is trivially copyable.
- Adding conditional specifications to.
- Revamped specification and use of integer-class types.
- 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."
February 2022
After the virtual WG21 meeting of 7 February 2022, the following features are added where they were approved by straw polls:- Allowed attributes on the function call operator of a lambda
- for
cmathandcstdlib - Function to mark unreachable code
- A type trait to detect reference binding to temporary
- Making
- Pipe support for user-defined range adaptors
- , and
- Windowing range adaptors: and
July 2022
After the virtual WG21 meeting of 25 July 2022, the following features and defect reports are added where they were approved by straw polls:- Made rewriting equality in expressions less of a breaking change.
- Reverted the deprecation of bitwise assignment to variables.
- Added the 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 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,
- Allowed [operators in C and C++|] and lambdas to be [static (keyword)|].
- Allowed the
thispointer 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_tfor these extended types accessible through the header, their corresponding literal suffixesf16f32f64f128bf16orF16F32F64F128BF16and added overloads to various standard library functions that take floats as arguments. - Added the 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 and 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 tostd::span. - and were added to the standard library.
- Added the and functions for printing formatted text to stdout.
- Provide the named modules and for importing the standard library.
- Added support for exclusive mode
fstreams, analogous to the "x" flag infopen. - Allowed
std::formatto handle ranges, tuples, and other containers. - Added
std::forward_like. - Made
std::string::substruse move semantics. - Added which implements a coroutine generator that models
- ,,,,.
- Added new algorithms:,, and ranges fold algorithms.
- Made
std::tuplecompatible with other tuple-like objects. - Explicit lifetime management for implicit-lifetime types.
- Made
std::bitsetand integral overloads ofstd::to_charsandstd::from_chars-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.
November 2022
After the hybrid WG21 meeting of 7 November 2022, the following features and defect reports are added where they were approved by straw polls:- Allowed to be.
- Allowed and [thread-local storage|] variables to appear in functions if they are usable in constant expressions.
- [consteval|] propagates upwards, that is, certain existing functions become 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 loop to cover the entire loop.
- Reverted the deprecation of compound assignment to variables.
- Monadic functions for.
- Synchronize the output of with the underlying stream if the native Unicode API is used.
February 2023
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:- Referencing the Unicode Standard.
- Stashing stashing iterators for proper flattening.
views::enumerate - making multi-param constructors of views explicit
- relaxing ranges just a smidge
- escaping improvements in
std::format - improving
std::format's width estimationstd::formatfill character allowances - formatting
thread::idandstacktrace - A type trait
std::is_implicit_lifetime,std::common_reference_tofstd::reference_wrappershould 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