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

Find a feature

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)

C++11: features, kind, and the first GCC, Clang and MSVC releases
FeatureKindGCCClangMSVC
Move semantics (rvalue references)Language4.32.9VS 2015
Move constructors and move assignmentLanguage4.63.0VS 2015
noexceptLanguage4.63.0VS 2015
Lambda expressionsLanguage4.53.1VS 2015
auto variablesLanguage4.42.9VS 2015
decltypeLanguage4.32.9VS 2015
Range-based forLanguage4.63.0VS 2015
constexprLanguage4.63.1VS 2015
nullptrLanguage4.63.0VS 2015
Variadic templatesLanguage4.32.9VS 2015
Initializer listsLanguage4.43.1VS 2015
static_assertLanguage4.32.9VS 2015
enum classLanguage4.42.9VS 2015
override and finalLanguage4.73.0VS 2015
= defaultLanguage4.43.0VS 2015
= deleteLanguage4.42.9VS 2015
Alias templates (using)Language4.73.0VS 2015
Default member initializersLanguage4.73.0VS 2015
std::unique_ptr libLibraryYesCompleteVS 2012
std::shared_ptr and std::weak_ptr libLibraryYesCompleteVS 2012
std::thread libLibraryPartialCompleteVS 2012
std::mutex and std::lock_guard libLibraryYesCompleteVS 2012
std::future and std::async libLibraryYesCompleteVS 2012
std::atomic libLibraryYesCompleteVS 2012
std::chrono durations, time points and clocks libLibraryYesCompleteVS 2012
std::function libLibraryPartialCompleteVS 2012
std::unordered_map and std::unordered_set libLibraryYesCompleteVS 2012
std::tuple libLibraryYesCompleteVS 2012
Checked · Sources (8)

GCC, C++ Standards Support in GCC, GCC, libstdc++ Implementation Status, Clang, C++ Support in Clang, LLVM, libc++ documentation, LLVM, libc++ 11 documentation, Microsoft, C/C++ language conformance, Microsoft, Support For C++11/14/17 Features, Microsoft, /std

Search and filters

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)

C++14: features, kind, and the first GCC, Clang and MSVC releases
FeatureKindGCCClangMSVC
Generic lambdasLanguage4.93.4VS 2015
Return type deduction for functionsLanguage4.93.4VS 2015
decltype(auto)Language4.93.3VS 2015
Lambda init-captureLanguage4.93.4VS 2015
Relaxed constexpr functionsLanguage53.4VS 2017 15.0
Variable templatesLanguage53.4VS 2015 Update 2
Binary literalsLanguage4.92.9VS 2015
Digit separatorsLanguage4.93.4VS 2015
[[deprecated]]Language4.93.4VS 2015
Default member initializers in aggregatesLanguage53.3VS 2017 15.0
std::make_unique libLibraryYes3.4VS 2013
std::exchange libLibraryYes3.4VS 2015
std::integer_sequence libLibraryYes3.4VS 2015
std::get<T> for tuples (by type) libLibraryYes3.4VS 2015
std::shared_timed_mutex and std::shared_lock libLibraryYes3.5VS 2015
String and duration literals ("s", 10ms) libLibraryYes3.4VS 2015
std::quoted libLibraryYes3.4VS 2015
Checked · Sources (6)

GCC, C++ Standards Support in GCC, GCC, libstdc++ Implementation Status, Clang, C++ Support in Clang, LLVM, libc++ 13 C++14 Status, Microsoft, C/C++ language conformance, Microsoft, /std

Search and filters

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)

C++17: features, kind, and the first GCC, Clang and MSVC releases
FeatureKindGCCClangMSVC
Structured bindingsLanguage74VS 2017 15.3
if constexprLanguage73.9VS 2017 15.3
Guaranteed copy elisionLanguage74VS 2017 15.6
Fold expressionsLanguage63.6VS 2017 15.5
Class template argument deduction (CTAD)Language75VS 2017 15.7
Inline variablesLanguage73.9VS 2017 15.5
if and switch with an initializerLanguage73.9VS 2017 15.3
Nested namespace definitionsLanguage63.6VS 2015 Update 3
[[nodiscard]]Language73.9VS 2017 15.3
constexpr lambdasLanguage75VS 2017 15.3
auto non-type template parametersLanguage74VS 2017 15.7
std::variant libLibrary7.14VS 2017 15.0
std::optional libLibrary7.14VS 2017 15.0
std::string_view libLibrary7.14VS 2017 15.0
std::any libLibrary7.14VS 2017 15.0
std::filesystem libLibrary8.17VS 2017 15.7
std::to_chars and std::from_chars libLibrary11.17 (partial)VS 2019 16.4
std::byte libLibrary7.15VS 2017 15.3
std::scoped_lock libLibrary7.15VS 2017 15.3
std::clamp libLibrary7.13.9VS 2015 Update 3
try_emplace and insert_or_assign libLibrary6.13.7VS 2015
Checked · Sources (6)

GCC, C++ Standards Support in GCC, GCC, libstdc++ Implementation Status, Clang, C++ Support in Clang, LLVM, libc++ C++17 Status, LLVM, libc++ C++1z status at LLVM 4.0, Microsoft, C/C++ language conformance

Search and filters

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)

C++20: features, kind, and the first GCC, Clang and MSVC releases
FeatureKindGCCClangMSVC
ConceptsLanguage1010VS 2019 16.3
Abbreviated function templates (constrained auto)Language1010VS 2019 16.9
ModulesLanguage11 (partial)15VS 2019 16.8
CoroutinesLanguage10 (requires -fcoroutines)PartialVS 2019 16.8
Three-way comparison (<=>)Language1010VS 2019 16.0
Designated initializersLanguage810VS 2019 16.1
constevalLanguage1117VS 2019 16.10
constinitLanguage1010VS 2019 16.10
using enumLanguage1113VS 2019 16.4
Template parameter lists for generic lambdasLanguage89VS 2019 16.2
Class types as non-type template parametersLanguage912VS 2019 16.6
[[likely]] and [[unlikely]]Language912VS 2019 16.6
Ranges libLibrary10.115VS 2019 16.10
std::format libLibrary13.114VS 2019 16.10
std::span libLibrary10.17VS 2019 16.6
std::jthread and std::stop_token libLibrary10.120VS 2019 16.9
std::bit_cast libLibrary11.114VS 2019 16.7
std::source_location libLibrary11.116VS 2019 16.10
contains() for maps and sets libLibrary9.113VS 2019 16.1
Checked · Sources (5)

GCC, C++ Standards Support in GCC, GCC, libstdc++ Implementation Status, Clang, C++ Support in Clang, LLVM, libc++ C++20 Status, Microsoft, C/C++ language conformance

Search and filters

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)

C++23: features, kind, and the first GCC, Clang and MSVC releases
FeatureKindGCCClangMSVC
Deducing this (explicit object parameters)Language1418VS 2022 17.13
if constevalLanguage1214VS 2022 17.14
Multidimensional subscript operatorLanguage1215VS 2022 17.12
auto(x) decay-copyLanguage1215VS 2026 18.0
static operator()Language1316VS 2022 17.14
size_t literal suffix (uz, z)Language1113VS 2022 17.13
#elifdef and #elifndefLanguage1213VS 2022 17.10
Simpler implicit moveLanguage1313VS 2026 18.0
[[assume]]Language1319Not yet
std::expected libLibrary12.116VS 2022 17.3
std::print and std::println libLibrary14.118VS 2022 17.7
std::generator libLibrary14.1Not yetVS 2022 17.13
std::mdspan libLibrary16.118VS 2022 17.9
std::flat_map libLibrary15.120VS 2026 18.6
std::ranges::to libLibrary14.117VS 2022 17.4
std::stacktrace libLibrary12.1Not yetVS 2022 17.4
std::move_only_function libLibrary12.1Not yetVS 2022 17.2
Monadic operations for std::optional libLibrary12.114VS 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

Search and filters

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

C++26: features, kind, and the first GCC, Clang and MSVC releases
FeatureKindGCCClangMSVC
std::inplace_vector libLibrary16.1Not yetNot yet
std::optional<T&> libLibrary16.122Not yet
std::simd libLibrary16.1Not yetNot yet
std::indirect and std::polymorphic libLibrary16.1Not yetNot yet
std::copyable_function libLibrary16.1Not yetNot yet
std::views::concat libLibrary15.123Not yet
std::views::cache_latest libLibrary15.1Not yetNot yet
std::text_encoding libLibrary14.123Not yet
Formatting pointers with std::format libLibrary14.117VS 2022 17.10
Member visit for std::variant libLibrary15.119Not yet
Checked · Sources (7)

GCC 14 release notes, GCC 15 release notes, GCC 16 release notes, LLVM, libc++ C++26 Status, LLVM, libc++ paper issues, Microsoft STL changelog, VS 2022, Microsoft STL, C++26 issues

Search and filters

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.

  1. 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.

  2. 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.

  3. The flag that turns it on. Each table starts with its flags: -std=c++20 for GCC and Clang, /std:c++20 for MSVC, and the exceptions worth knowing, such as GCC’s modules needing -fmodules and MSVC having no mode older than C++14.

  4. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Find a feature