Free · C++11 to C++26 · GCC, Clang and MSVC
Since when can you use it?The standard and the first GCC, Clang and MSVC releases for each C++ feature
Find a language or library feature from C++11 to C++26 and see the standard that added it, the first GCC, Clang and MSVC releases that support it and the flag that turns it on, each cell taken from the vendor’s own status page.
- Document
- Since When
- Covers
- C++11 to C++26
- Features
- 113, in 6 tables
- Compilers
- GCC, Clang, MSVC
- Updated
No feature in the six tables matches that.
C++11 28 features
The standard that rewrote everyday C++: move semantics, lambdas, auto, constexpr and range-based for in the language; smart pointers, threads, atomics and std::chrono in the library. Microsoft dates both halves as groups: its conformance table gives Visual Studio 2015 for the core language, and its C++11 feature page gives Visual Studio 2012 for the library.
Flags GCC -std=c++11; Clang -std=c++11; MSVC none (Visual Studio 2017 and later have no mode older than /std:c++14, the default)
| Feature | Kind | GCC | Clang | MSVC |
|---|---|---|---|---|
| Move semantics (rvalue references) | Language | 4.3 | 2.9 | VS 2015 |
| Move constructors and move assignment | Language | 4.6 | 3.0 | VS 2015 |
noexcept | Language | 4.6 | 3.0 | VS 2015 |
| Lambda expressions | Language | 4.5 | 3.1 | VS 2015 |
auto variables | Language | 4.4 | 2.9 | VS 2015 |
decltype | Language | 4.3 | 2.9 | VS 2015 |
Range-based for | Language | 4.6 | 3.0 | VS 2015 |
constexpr | Language | 4.6 | 3.1 | VS 2015 |
nullptr | Language | 4.6 | 3.0 | VS 2015 |
| Variadic templates | Language | 4.3 | 2.9 | VS 2015 |
| Initializer lists | Language | 4.4 | 3.1 | VS 2015 |
static_assert | Language | 4.3 | 2.9 | VS 2015 |
enum class | Language | 4.4 | 2.9 | VS 2015 |
override and final | Language | 4.7 | 3.0 | VS 2015 |
= default | Language | 4.4 | 3.0 | VS 2015 |
= delete | Language | 4.4 | 2.9 | VS 2015 |
Alias templates (using) | Language | 4.7 | 3.0 | VS 2015 |
| Default member initializers | Language | 4.7 | 3.0 | VS 2015 |
std::unique_ptr lib | Library | Yes | Complete | VS 2012 |
std::shared_ptr and std::weak_ptr lib | Library | Yes | Complete | VS 2012 |
std::thread lib | Library | Partial | Complete | VS 2012 |
std::mutex and std::lock_guard lib | Library | Yes | Complete | VS 2012 |
std::future and std::async lib | Library | Yes | Complete | VS 2012 |
std::atomic lib | Library | Yes | Complete | VS 2012 |
std::chrono durations, time points and clocks lib | Library | Yes | Complete | VS 2012 |
std::function lib | Library | Partial | Complete | VS 2012 |
std::unordered_map and std::unordered_set lib | Library | Yes | Complete | VS 2012 |
std::tuple lib | Library | Yes | Complete | VS 2012 |
C++14 17 features
A finishing pass on C++11: generic lambdas, return type deduction, relaxed constexpr, variable templates and digit separators; std::make_unique, std::exchange and the string and duration literals in the library. Small on paper, it is the release that made lambdas and constexpr functions comfortable to write.
Flags GCC -std=c++14 (the default in GCC 6.1 to 10); Clang -std=c++14; MSVC /std:c++14 (the default, from VS 2015 Update 3)
| Feature | Kind | GCC | Clang | MSVC |
|---|---|---|---|---|
| Generic lambdas | Language | 4.9 | 3.4 | VS 2015 |
| Return type deduction for functions | Language | 4.9 | 3.4 | VS 2015 |
decltype(auto) | Language | 4.9 | 3.3 | VS 2015 |
| Lambda init-capture | Language | 4.9 | 3.4 | VS 2015 |
Relaxed constexpr functions | Language | 5 | 3.4 | VS 2017 15.0 |
| Variable templates | Language | 5 | 3.4 | VS 2015 Update 2 |
| Binary literals | Language | 4.9 | 2.9 | VS 2015 |
| Digit separators | Language | 4.9 | 3.4 | VS 2015 |
[[deprecated]] | Language | 4.9 | 3.4 | VS 2015 |
| Default member initializers in aggregates | Language | 5 | 3.3 | VS 2017 15.0 |
std::make_unique lib | Library | Yes | 3.4 | VS 2013 |
std::exchange lib | Library | Yes | 3.4 | VS 2015 |
std::integer_sequence lib | Library | Yes | 3.4 | VS 2015 |
std::get<T> for tuples (by type) lib | Library | Yes | 3.4 | VS 2015 |
std::shared_timed_mutex and std::shared_lock lib | Library | Yes | 3.5 | VS 2015 |
String and duration literals ("s", 10ms) lib | Library | Yes | 3.4 | VS 2015 |
std::quoted lib | Library | Yes | 3.4 | VS 2015 |
C++17 21 features
Structured bindings, if constexpr, fold expressions and guaranteed copy elision in the language; std::optional, std::variant, std::string_view, std::filesystem and std::to_chars in the library. It is the default mode of GCC 11 to 15 and of Clang since 16.
Flags GCC -std=c++17 (the default in GCC 11 to 15); Clang -std=c++17 (the default since Clang 16); MSVC /std:c++17 (from VS 2017 15.3)
| Feature | Kind | GCC | Clang | MSVC |
|---|---|---|---|---|
| Structured bindings | Language | 7 | 4 | VS 2017 15.3 |
if constexpr | Language | 7 | 3.9 | VS 2017 15.3 |
| Guaranteed copy elision | Language | 7 | 4 | VS 2017 15.6 |
| Fold expressions | Language | 6 | 3.6 | VS 2017 15.5 |
| Class template argument deduction (CTAD) | Language | 7 | 5 | VS 2017 15.7 |
| Inline variables | Language | 7 | 3.9 | VS 2017 15.5 |
if and switch with an initializer | Language | 7 | 3.9 | VS 2017 15.3 |
| Nested namespace definitions | Language | 6 | 3.6 | VS 2015 Update 3 |
[[nodiscard]] | Language | 7 | 3.9 | VS 2017 15.3 |
constexpr lambdas | Language | 7 | 5 | VS 2017 15.3 |
auto non-type template parameters | Language | 7 | 4 | VS 2017 15.7 |
std::variant lib | Library | 7.1 | 4 | VS 2017 15.0 |
std::optional lib | Library | 7.1 | 4 | VS 2017 15.0 |
std::string_view lib | Library | 7.1 | 4 | VS 2017 15.0 |
std::any lib | Library | 7.1 | 4 | VS 2017 15.0 |
std::filesystem lib | Library | 8.1 | 7 | VS 2017 15.7 |
std::to_chars and std::from_chars lib | Library | 11.1 | 7 (partial) | VS 2019 16.4 |
std::byte lib | Library | 7.1 | 5 | VS 2017 15.3 |
std::scoped_lock lib | Library | 7.1 | 5 | VS 2017 15.3 |
std::clamp lib | Library | 7.1 | 3.9 | VS 2015 Update 3 |
try_emplace and insert_or_assign lib | Library | 6.1 | 3.7 | VS 2015 |
C++20 19 features
The largest standard since C++11: concepts, modules, coroutines, three-way comparison and consteval in the language; ranges, std::format, std::span and std::jthread in the library. GCC builds as C++20 by default since GCC 16.
Flags GCC -std=c++20 (the default since GCC 16, -std=c++2a in GCC 9 and earlier, modules also need -fmodules); Clang -std=c++20 (-std=c++2a in Clang 9 and earlier); MSVC /std:c++20 (from VS 2019 16.11, /std:c++latest before it)
| Feature | Kind | GCC | Clang | MSVC |
|---|---|---|---|---|
| Concepts | Language | 10 | 10 | VS 2019 16.3 |
Abbreviated function templates (constrained auto) | Language | 10 | 10 | VS 2019 16.9 |
| Modules | Language | 11 (partial) | 15 | VS 2019 16.8 |
| Coroutines | Language | 10 (requires -fcoroutines) | Partial | VS 2019 16.8 |
Three-way comparison (<=>) | Language | 10 | 10 | VS 2019 16.0 |
| Designated initializers | Language | 8 | 10 | VS 2019 16.1 |
consteval | Language | 11 | 17 | VS 2019 16.10 |
constinit | Language | 10 | 10 | VS 2019 16.10 |
using enum | Language | 11 | 13 | VS 2019 16.4 |
| Template parameter lists for generic lambdas | Language | 8 | 9 | VS 2019 16.2 |
| Class types as non-type template parameters | Language | 9 | 12 | VS 2019 16.6 |
[[likely]] and [[unlikely]] | Language | 9 | 12 | VS 2019 16.6 |
| Ranges lib | Library | 10.1 | 15 | VS 2019 16.10 |
std::format lib | Library | 13.1 | 14 | VS 2019 16.10 |
std::span lib | Library | 10.1 | 7 | VS 2019 16.6 |
std::jthread and std::stop_token lib | Library | 10.1 | 20 | VS 2019 16.9 |
std::bit_cast lib | Library | 11.1 | 14 | VS 2019 16.7 |
std::source_location lib | Library | 11.1 | 16 | VS 2019 16.10 |
contains() for maps and sets lib | Library | 9.1 | 13 | VS 2019 16.1 |
C++23 18 features
Deducing this, if consteval and multidimensional subscripts in the language; std::expected, std::print, std::generator, std::mdspan and std::flat_map in the library. GCC’s page says the standard was finalized in 2023 and published in 2024.
Flags GCC -std=c++23; Clang -std=c++23; MSVC /std:c++latest (or /std:c++23preview, from VS 2022 17.13, for C++23 features alone)
| Feature | Kind | GCC | Clang | MSVC |
|---|---|---|---|---|
Deducing this (explicit object parameters) | Language | 14 | 18 | VS 2022 17.13 |
if consteval | Language | 12 | 14 | VS 2022 17.14 |
| Multidimensional subscript operator | Language | 12 | 15 | VS 2022 17.12 |
auto(x) decay-copy | Language | 12 | 15 | VS 2026 18.0 |
static operator() | Language | 13 | 16 | VS 2022 17.14 |
size_t literal suffix (uz, z) | Language | 11 | 13 | VS 2022 17.13 |
#elifdef and #elifndef | Language | 12 | 13 | VS 2022 17.10 |
| Simpler implicit move | Language | 13 | 13 | VS 2026 18.0 |
[[assume]] | Language | 13 | 19 | Not yet |
std::expected lib | Library | 12.1 | 16 | VS 2022 17.3 |
std::print and std::println lib | Library | 14.1 | 18 | VS 2022 17.7 |
std::generator lib | Library | 14.1 | Not yet | VS 2022 17.13 |
std::mdspan lib | Library | 16.1 | 18 | VS 2022 17.9 |
std::flat_map lib | Library | 15.1 | 20 | VS 2026 18.6 |
std::ranges::to lib | Library | 14.1 | 17 | VS 2022 17.4 |
std::stacktrace lib | Library | 12.1 | Not yet | VS 2022 17.4 |
std::move_only_function lib | Library | 12.1 | Not yet | VS 2022 17.2 |
Monadic operations for std::optional lib | Library | 12.1 | 14 | VS 2022 17.2 |
Checked · Sources (9)
GCC, C++ Standards Support in GCC, GCC, libstdc++ Implementation Status, GCC 14 release notes, Clang, C++ Support in Clang, LLVM, libc++ C++23 Status, LLVM, libc++ paper issues, Microsoft, C/C++ language conformance, Microsoft STL changelog, VS 2022, Microsoft STL changelog, MSVC Build Tools
C++26 10 features
Static reflection, contracts and std::execution are its headline features, but Microsoft’s conformance table has no C++26 language rows yet, so for now this table holds the library features that GCC, Clang and Microsoft all report on. GCC’s page calls its support experimental and says the standard is expected to be published in 2026; Clang calls its mode C++2c.
Flags GCC -std=c++26 (GCC 14 and later); Clang -std=c++2c; MSVC /std:c++latest
| Feature | Kind | GCC | Clang | MSVC |
|---|---|---|---|---|
std::inplace_vector lib | Library | 16.1 | Not yet | Not yet |
std::optional<T&> lib | Library | 16.1 | 22 | Not yet |
std::simd lib | Library | 16.1 | Not yet | Not yet |
std::indirect and std::polymorphic lib | Library | 16.1 | Not yet | Not yet |
std::copyable_function lib | Library | 16.1 | Not yet | Not yet |
std::views::concat lib | Library | 15.1 | 23 | Not yet |
std::views::cache_latest lib | Library | 15.1 | Not yet | Not yet |
std::text_encoding lib | Library | 14.1 | 23 | Not yet |
Formatting pointers with std::format lib | Library | 14.1 | 17 | VS 2022 17.10 |
Member visit for std::variant lib | Library | 15.1 | 19 | Not yet |
What a row tells you
One row per feature, in the table of the standard that added it. Search all six tables at once, or narrow them to one standard, or to language or library features.
Six tables, one per standard from C++11 to C++26. Each row is a language or library feature with the first GCC, Clang and MSVC releases that support it; for a library feature, the release whose standard library first ships it: libstdc++ for GCC, libc++ (by LLVM release) for Clang, the Microsoft STL (by Visual Studio version) for MSVC. A cell is a release, a release with the vendor’s own qualifier such as (partial), Not yet when the vendor lists the feature as unimplemented, or the vendor’s status word (Yes, Partial, Complete) where its page gives a status instead of a release. Every cell comes from the vendor’s own page, linked under each table with the date it was checked.
The standard that added it. Each table is one standard, from C++11 to C++26, and a feature sits in the table of the standard that added it. That is the standard your build has to ask for before any compiler version matters.
The first GCC, Clang and MSVC releases. For a language feature, the first compiler release that supports it; for a library feature, the first release whose library ships it (libstdc++, libc++, the Microsoft STL). Where a vendor’s page gives a status instead of a release, the cell quotes it: Yes, Partial, Complete.
The flag that turns it on. Each table starts with its flags:
-std=c++20for GCC and Clang,/std:c++20for MSVC, and the exceptions worth knowing, such as GCC’s modules needing-fmodulesand MSVC having no mode older than C++14.Where it came from, and when. Under each table: the vendor pages its cells were read from and the date they were checked. Nothing is filled in from memory, and a feature whose cells can’t be shown from those pages waits until they can.
How a row gets in
Read the vendor’s own page. GCC’s and Clang’s C++ status pages, the libstdc++ and libc++ status pages, Microsoft’s conformance table and the Microsoft STL changelog it points to, downloaded and read as tables, not as summaries.
Follow the feature’s own paper. Status pages list committee papers or clauses of the standard, not features. A row follows the paper that added the feature (P0734R0 for concepts) and gives the first release the vendor lists with full support for it, or the vendor’s status where it gives no release.
Leave out what can’t be shown. If one vendor’s page gives neither a release nor a status for a feature, the whole row waits. A shorter table that is right is worth more than a full one with a guess in it.
Check again at each release. When GCC, LLVM or Visual Studio ships a release, the tables are read again against the vendors’ pages and each standard’s Checked date moves.
Questions about Since When
Is Since When free? Do I need an account?
It’s free, with nothing to sign up for or install. Search it, filter it and link to it as often as you like. Cpp Next earns from its articles, not from the tool, and there are no ads inside the tables.
Where do the versions come from?
From each vendor’s own pages: GCC’s C++ standards support page and the libstdc++ status tables in the GCC manual, plus GCC’s release notes for the C++23 and C++26 library features those tables don’t list; Clang’s C++ status page, libc++’s status pages and LLVM’s archived libc++ documentation; Microsoft’s C/C++ language conformance table, the Microsoft STL changelog it points to and, for the C++11 library, Microsoft’s C++11 feature page. Each standard’s Sources line links the pages its cells came from. Cpp Next isn’t affiliated with the C++ committee or with any of these vendors.
What exactly does a cell mean?
The first release the vendor lists with full support for the paper that added the feature. In the GCC column a language cell is a GCC release (7) and a library cell is a libstdc++ release (7.1, the first release of GCC 7). In the Clang column a library cell is the LLVM release whose libc++ ships the feature. MSVC cells are Visual Studio versions; Visual Studio 2026 18.0 and 18.6 shipped MSVC Build Tools 14.50 and 14.51. (partial) means the vendor marks its support incomplete; Not yet means the vendor’s status page or tracking issue lists the feature as unimplemented; and Yes, Partial or Complete with no number is the vendor’s own status word, used where its page gives a status instead of a release.
Why does MSVC say VS 2015 or VS 2012 for every C++11 feature?
Because Microsoft dates C++11 in two groups. Its conformance table gives Visual Studio 2015 for the core language features, apart from a few it names separately: two-phase name lookup and expression SFINAE came in Visual Studio 2017 15.7. Its C++11 feature page, in the Visual Studio 2015 documentation, says Visual Studio 2012 implemented the C++11 Standard Library, simulating variadic templates where the compiler lacked them; real variadic templates came in Visual Studio 2013. MSVC in Visual Studio 2017 and later has no mode older than /std:c++14, its default.
Why do some cells say Yes, Partial or Complete instead of a release?
Because that is what the vendor’s page gives. libstdc++’s manual marks each part of the C++11 and C++14 library as implemented (Y, written Yes here) or Partial without saying from which release; it lists std::thread as Partial because thread::id comparisons aren’t well-defined, and std::function for missing allocator support. libc++’s documentation calls its C++11 support complete without per-feature releases, while its archived C++14 status page does give them. Clang’s C++20 page lists coroutines as Partial with no release number, because of open stability and ABI issues on Windows. A status word says the vendor ships the feature, or part of it, today; it doesn’t say since when.
Why does libc++ say 4 for std::optional, std::string_view and std::any?
Because libc++’s own status page as it stood at LLVM 4.0 (the llvmorg-4.0.0 tag) marks complete in 4.0 the papers that change these types (P0307R2 and P0032R3 for std::optional, P0032R3 for std::any, P0254R2 for std::string_view), and a paper that changes a type can’t be complete in a release that lacks it; the cell is read that way rather than stated outright. The paper that added all three, Library Fundamentals V1 (P0220R1), is marked complete only in LLVM 16, when its last piece landed, so 16 would be the wrong answer.
Where are reflection, contracts and pack indexing?
Waiting for Microsoft. Its conformance table has no C++26 language rows yet, so no MSVC cell can be filled, and the C++26 table holds only library features all three vendors report on. For now, GCC’s page lists reflection in GCC 16 behind -freflection, contracts in GCC 16 and pack indexing in GCC 15; Clang’s lists pack indexing in Clang 19 and reflection and contracts as not implemented. std::execution waits for GCC: neither libstdc++’s manual nor GCC’s release notes list it yet.
Is C++26 published?
None of the pages these tables come from says so yet. GCC’s status page says the next revision of the standard is expected to be published in 2026 and calls GCC’s support experimental, Clang calls its mode C++2c, and libc++ notes that features in unreleased drafts of the standard are subject to change. Treat the C++26 rows as early support that can still move.
My compiler is newer than the cell, but the feature doesn’t build. Why?
Usually one of four things. The flag: a C++23 feature needs -std=c++23, or /std:c++latest on MSVC, and some need more, such as -fmodules for modules in GCC, or -fcoroutines for coroutines in GCC 10. The library: the GCC column is libstdc++ and the Clang column is libc++, so Clang building against libstdc++ follows the GCC column for library features. A cell marked (partial). Or Apple’s Clang in Xcode, which has its own version numbers and isn’t covered here. If it’s none of these, send the feature, the compiler version and the flags through the contact page.
How current are the tables?
Each standard’s Checked line gives the day its cells were last read against the vendors’ pages. They’re read again after each GCC, LLVM and Visual Studio release, and the date moves with each check.
A cell is wrong, or a feature is missing. Where do I tell you?
Through the contact page: the feature, the cell, and the vendor page that says otherwise. A row goes in when every one of its cells can be shown from a vendor’s page, so that link is what gets it in.
Which standard does your code need?
Six tables from C++11 to C++26, every cell taken from the vendor’s own page and dated.