It’s almost the eve of 2023 and the C++23 standard is feature complete for some while. At some point next year, the new standard version will be formally approved and we will officially have a new version of the standard. But compilers and library implementors are already supporting some of the new additions (or updates) to the standard. If you haven’t been following closely the evolution of C++23 you are probably wondering what’s in this new version.
In this article, you will find a list of the most significant changes to the standard. There is actually quite a long list of proposals that have been accepted . Yet, some of these are things that you won’t use that often; on the other hand, many are defect reports, meaning they are fixing an issue introduced in a previous version of the standard.
You can find the entire list of changes at cppreference.com. This page doesn’t only list the C++23 features, but also which compiler supports them. However, to help you get an overview of what are the significant parts of C++23, I have curated the following tables, where you will find a short description for each entry as well as links to articles and papers where you can learn more about each feature.
C++23 Core Language Features
C++23 Library Features
C++23 Ranges Library Features
Conclusions
The C++23 version of the standard contains many new entries but overall if feels a lesser increment comparing to the C++17 and C++20 versions. I find it difficult to pinpoint any core language feature that stands out in the list. I could perhaps mention std::expected
, std::print
and monadic operations for std::optional
when it comes to the standard library, as well as the several additions to the ranges library.
On the other hand, I’d appreciate if you tell us what are your favorite features or which one do you think are the most important.
very exciting upcoming features! the new cppcast (12/2022) also talks about few of them like [[assume]], and I believe there was something related to starting lifetime as with other functions (not only malloc and similar).
I don’t see anything super-important, myself, but I like that we won’t need to use `some_string.find(some_thing) != std::string::npos` or roll our own helpers anymore. A decent portion of this just feels like it’s standardising common idioms and helpers, so that’s nice, but there isn’t really any “wow factor” to it, so to speak.