Modern "Hello, world" Example
After many library changes applied to the working draft, the new "Hello, world" program will beFeatures
Changes that have been accepted into C++23 include:Language
*explicitthis
object parameter
*if consteval
*multidimensional subscript operator
*static call and subscript operators and static lambdas
*simplifying implicit move
*auto(x)
and auto
*new preprocessor directives:
**#elifdef
and #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 std::size_t
and the corresponding signed type
*extended floating-point types with literals (conditionally supported)
*optional ()
from nullary lambda expressions
*attributes on lambda expressions
*constexpr
changes:
**non-literal variables, labels, and goto
s in constexpr
functions
**allowing static
and thread_local
variables that are usable in constant expressions in constexpr
functions
**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
*narrowing contextual conversions to bool
in static_assert
and if 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
Library
Standard Library Module Support
*standard library modulesstd
and std.compat
Coroutine Library Support
*synchronous coroutinestd::generator
for rangesGeneral Utilities Support
*result typestd::expected
*monadic operations for std::optional
and std::expected
*utility function std::to_underlying
to get the underlying value of enum
*move-only callable wrapper std::move_only_function
*std::forward_like
*std::invoke_r
*std::bind_back
*std::byteswap
*std::unreachable
: a function to mark std::tuple
compatible with other ''tuple-like'' objects
*std::basic_common_reference
specialization for std::reference_wrapper
yielding reference types
*adding default arguments for std::pair
's forwarding constructor
Compile-time Support
*constexpr
support for:
**std::type_info::operator
** std::bitset
** std::unique_ptr
** for some
functions
** for integral overloads of std::to_chars
and std::from_chars
*metaprogramming utilities:
**type traits std::is_scoped_enum
, std::is_implicit_lifetime
, std::reference_constructs_from_temporary
, and std::reference_converts_from_temporary
.
*adding move-only types support for comparison concepts
Iterators, Ranges, and Algorithm Support
*new range conversion functionstd::ranges::to
*new constrained ranges algorithm:
**std::ranges::starts_with
**std::ranges::ends_with
**std::ranges::contains
**std::ranges::contains_subrange
**std::ranges::find_last
and other variants
**rangified versions of iota
, shift_left
, and shift_right
**range fold algorithms
* new std::ranges::range_adaptor_closure
, a helper for defining user-defined range adaptor closures
*new range adaptors:
**std::views::zip
and other variants
**std::views::adjacent
and 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::cbegin
and other similar utilities returning constant iterators should be fully guaranteed even for shallow-const views (such as std::span
)
*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_ptr
and std::inout_ptr
for C interoperability
*std::allocate_at_least
and std::allocator::allocate_at_least
*explicit lifetime management function std::start_lifetime_as
for 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::contains
and std::basic_string::contains
**disabling construction from nullptr
for std::basic_string
and std::basic_string_view
**explicit range constructor for std::basic_string_view
**std::basic_string::resize_and_overwrite
**rvalue reference overload of std::basic_string::substr
for efficient slicing
*formatting ranges, tuples, escaped presentation of characters and strings, std::thread::id
, and stacktraces.
Diagnostic Support
*stacktrace libraryI/O Support
*formatted output functionsstd::print
and std::println
from new header
*spanstream library (std::span
-based string stream) from new header
*a support for exclusive mode in std::fstream
s
*std::basic_ostream::operator<<(const volatile void*)
Containers Support
*multidimensional-spanstd::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::span
and std::basic_string_view
to 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 ofchar8_t
*relaxing requirements on wchar_t
to match existing practices
*allowing some pointers and references of this
or unknown origin in constant expressions
*introduction of immediate-escalating functions promoted to immediate functions
*allowing static_assert(false)
in uninstantiated template contexts
Library defect reports
*changes in ranges library: **conditionally borrowed ranges **repairing input range adaptors andstd::counted_iterator
**relaxing the constraint on std::ranges::join_view
**renamed std::ranges::split_view
to std::ranges::lazy_split_view
and new split_view
**removed std::default_initializable
constraint from concept std::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 constexpr
std::variant
and std::optional
*supporting types derived from std::variant
in std::visit
Removed features and deprecation
Removed features: *Garbage Collection Support and (strict) Pointer Safety (meaning only ''relaxed pointer safety'' is to be relied upon). This minimal garbage collection support (and pointer safety, needed for it), 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 it can also just be used for leak detection in leak detection, when in debug mode), 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. Deprecated features: *std::aligned_storage
and std::aligned_union
*std::numeric_limits::has_denorm
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
* Concurrency TS v2Compiler support
*-std=c++23
.
* 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
.
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.November 2020
The following were added after the virtual WG21 meeting of 9 November 2020, where they were approved by straw polls: * Literal suffixes forstd:: size_t
and 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 . * for , , and . * Iterators pair constructors for (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 object parameter. * Changes on character sets and encodings. * New preprocessors: and . Both directives were added to C23 (C language update) and GCC 12. * Allowing alias declarations in init-statement. * Overloading multidimensional subscript operator (e.g. ). * 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: *** *** *** (and being equivalent to ) *** (and being equivalent to ) * . * Monadic operations for . * Member function template . * Printing 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 * * forcmath
and cstdlib
* Function to mark 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 this
pointer and std::float16_t
, std::float32_t
, std::float64_t
, std::float128_t
, std::bfloat16_t
for these extended types accessible through the header
, their corresponding literal suffixes f16
f32
f64
f128
bf16
or F16
F32
F64
F128
BF16
and 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 std::mdspan
, a multidimensional array view analogous to std::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 in fopen
.
* Allowed std::format
to handle ranges, tuples, and other containers.
* Added std::forward_like
.
* Made std::string::substr
use move semantics.
* Added which implements a coroutine generator that models
* , , , , .
* Added new algorithms: , , 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
-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 variables to appear in functions if they are usable in constant expressions. * 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 (all, not just bitwise) 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 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
External links
References
{{C++ programming language C++ C++ programming language family Algol programming language family High-level programming languages Statically typed programming languages