Namespaces
Variants
Actions

C++ compiler support

From cppreference.com
< cpp


The following tables present compiler support for new C++ features. These include accepted revisions to the standard, as well as various technical specifications:

Contents

[edit] Notes

* - hover over a cell marked with the star * to see additional pop-up notes.
DRnn - the number nn after "DR" denotes target C++ revision the Defect Report is applied to, e.g., DR20 → C++20.

[edit] C++26 features

Note that this list may change, as the draft C++26/2c standard evolves.

[edit] C++26 core language features

C++26 feature

 
Paper(s)

 
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
DR98: Removing undefined behavior from lexingP2621R3Yes3.316.0.0*
DR98: Making non-encodable string literals ill-formedP1854R4141416.0.0*
Unevaluated stringsP2361R61417 (partial)*
18
16.0.0*
Adding @, $, and ` to the basic character setP2558R215Yes16.0.0*
constexpr cast from void*  (FTM)*P2738R11417
DR20: On the ignorability of standard attributesP2552R315Yes
DR11: Static storage for braced initializersP2752R314
User-generated static_assert messages  (FTM)*P2741R31417
Placeholder variables with no name  (FTM)*P2169R41418
Pack indexing  (FTM)*P2662R31519
Removing deprecated arithmetic conversion on enumerationsP2864R21418
DR11/20: Template parameter initializationP2308R1918
Disallow binding a returned reference to a temporaryP2748R51419
Attributes for structured bindings  (FTM)*P0609R31519
Erroneous behavior for uninitialized reads, [[indeterminate]] attributeP2795R5
= delete("reason");  (FTM)*P2573R21519
Variadic friends  (FTM)*P2893R31520
DR98: Clarifying rules for brace elision in aggregate initializationP3106R1Yes17
DR20: Disallow module declarations to be macrosP3034R115
DR11: Trivial infinite loops are not undefined behaviorP2809R31419
constexpr placement new  (FTM)*  (FTM)*P2747R21520
Structured binding declaration as a condition  (FTM)*P0963R3156 (partial)*
21
Ordering of constraints involving fold expressions  (FTM)*P2963R319
Deleting a pointer to an incomplete type should be ill-formedP3144R215196.7
Structured bindings can introduce a pack  (FTM)*P1061R1021
constexpr structured bindings and references to constexpr variablesP2686R56.7
constexpr exceptions: [1], [2]  (FTM)*P3068R6
Oxford variadic commaP3176R11520
Removing deprecated array comparisonsP2865R61520
#embed  (FTM)*P1967R141519*
Concept and variable-template template-parameters  (FTM)*P2841R7
Trivial relocatability  (FTM)*P2786R13
Trivial unions  (FTM)*P3074R7
Observable checkpointsP1494R5
Contracts  (FTM)*P2900R14
 

C++26 feature
 

Paper(s)
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray

[edit] C++26 library features

C++26 feature

 
Paper(s)

 
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
Testing for success or failure of <charconv> functions  (FTM)*P2497R0141816.0.0*
std::text_encoding: text encodings identification  (FTM)*P1885R12
P2862R1
14
Arithmetic overloads of std::to_string and std::to_wstring use std::format  (FTM)*P2587R314
Type checking format args  (FTM)*P2757R315
Formatting pointers  (FTM)*P2510R314*17*19.40**
Hashing support for std::chrono value classes  (FTM)*P2592R3
<rcu>: Read-Copy Update  (FTM)*P2545R4
<hazard_pointer>: Hazard pointers  (FTM)*P2530R3
ADL-proof std::projectedP2538R114*18*19.38**16.0.0*
constexpr stable sorting  (FTM)*P2562R11521
Member std::basic_format_arg::visit()  (FTM)*P2637R31519
Member std::variant::visit()  (FTM)*P2637R31518
std::is_within_lifetime  (FTM)*P2641R4
Extending associative containers with the remaining heterogeneous overloads  (FTM)*P2363R5
Enabling the use of std::weak_ptr as keys in unordered associative containers  (FTM)*P1901R2
Native handles in file streams  (FTM)*P1759R6141816.0.0*
Interfacing string streams with std::string_view  (FTM)*P2495R319
Interfacing std::bitset with std::string_view  (FTM)*P2697R11816.0.0*
More constexpr for <cmath> and <complex>  (FTM)*  (FTM)*P1383R24.6 (partial)*
Adding the new 2022 SI prefixes on ratios: std::quecto, std::ronto, std::ronna, and std::quetta  (FTM)*P2734R01417*
std::function_ref: type-erased callable reference  (FTM)*P0792R14
std::copyable_function  (FTM)*P2548R6
std::bind_front, std::bind_back, and std::not_fn to NTTP callables  (FTM)*  (FTM)*  (FTM)*P2714R1
std::submdspan()  (FTM)*P2630R4
P3355R1
Freestanding language: Optional ::operator newP2013R5N/A
Freestanding std::char_traits, std::errc and facilities in: <charconv>, <cstdlib>, <cstring>, <cwchar>  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*P2338R4N/A
More freestanding facilities  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*P2198R7N/A
Saturation arithmetic  (FTM)*P0543R3141816.0.0*
<debugging>: Debugging support  (FTM)*P2546R5
P2810R4
<linalg>: A free function linear algebra interface based on the BLAS  (FTM)*P1673R13
P3050R2
P3222R0
Making assert() macro user friendlyP2264R7
Runtime format strings  (FTM)*P2918R2141816.0.0*
std::span over an initializer list  (FTM)*P2447R6151816.0.0*
std::span::at()  (FTM)*P2821R5141816.0.0*
Added tuple protocol to std::complex  (FTM)*P2819R21519
A new specification for std::generate_canonicalP0952R219.42*
Removing deprecated typedef std::allocator::is_always_equalP2868R3151816.0.0*
Removing function overload of std::basic_string::reserve() that takes no argumentP2870R31816.0.0*
Removing deprecated Unicode conversion facets (<codecvt>)P2871R31816.0.0*
Freestanding: removing std::strtok  (FTM)*P2937R01419.40*
Freestanding library: partial classes  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*P2407R51419.42*
Freestanding library: std::inout, std::expected, std::span  (FTM)*  (FTM)*  (FTM)*  (FTM)*P2833R21419.42*
DR23: std::basic_const_iterator should follow its underlying type’s convertibility  (FTM)*P2836R1
P2950R0
1419.40*
DR20: std::make_format_args now accepts only lvalue references instead of forwarding referencesP2905R2141819.40*16.0.0*
DR20: Fix formatting of code units as integers  (FTM)*P2909R413.31819.40*16.0.0*
views::concat  (FTM)*P2542R815
Concatenation of strings and string views  (FTM)*P2591R51519
Enabling list-initialization for algorithms  (FTM)*P2248R8
P3217R0
15
std::ranges::generate_random  (FTM)*P1068R11
Comparisons for std::reference_wrapper, and constraints for comparisons of std::pair, std::tuple, std::optional, and std::variant  (FTM)*  (FTM)*P2944R31419 (partial)*
Padded mdspan layouts  (FTM)*P2642R6
New CTAD for std::span and std::mdspan with integral constantsP3029R119
Atomic maximum and minimum  (FTM)*P0493R5
std::formatter<std::filesystem::path>  (FTM)*P2845R8
Printing Blank Lines with std::println()  (FTM)*P3142R014*19*19.41**
Undeprecate std::polymorphic_allocator::destroyP2875R41519.41*
Removing deprecated strstreamsP2867R219
Removing deprecated std::shared_ptr Atomic Access APIsP2869R4
Removing std::wstring_convertP2872R319
DR23: Permit an efficient implementation of std::print  (FTM)*P3107R5
P3235R3
19.43*
Execution control library  (FTM)*P2300R10
P3396R0
std::inplace_vector: dynamically-resizable vector with fixed capacity  (FTM)*P0843R14
std::philox_engine: counter-based random number engine  (FTM)*P2075R6
std::optional range support  (FTM)*P3168R2
std::is_virtual_base_of: type trait for detecting virtual base classes  (FTM)*P2985R01520
std::dims for std::mdspan  (FTM)*P2389R219
DR11: Formal specification of the type of std::ignoreP2968R2151919.42*
DR20: Removing the common reference requirement from the indirectly invocable concepts  (FTM)*P2997R1151919.42*
Deprecating std::is_trivial and std::is_trivial_vP3247R21521
DR20: Algorithm function objectsP3136R1Yes1419.39*14.0.3*
std::ranges::cache_latest_view  (FTM)*P3138R515
Constraining std::expected equality operators  (FTM)*P3379R015
std::aligned_accessor: an std::mdspan accessor expressing pointer over-alignment  (FTM)*P2897R721
std::is_sufficiently_aligned: checks a pointer’s alignment precondition  (FTM)*P2897R721
std::atomic_ref::address()  (FTM)*P2835R7
DR11/20: cv-qualified types in std::atomic and std::atomic_refP3323R119.44*
constexpr std::atomic and std::atomic_ref  (FTM)*P3309R3
constexpr for specialized memory algorithms  (FTM)*P3508R0
P3369R0
15
<stdbit.h> and <stdckdint.h>P3370R115
<simd>: data-parallel types  (FTM)*  (FTM)*P1928R15
P3430R3
P3441R2
P3287R3
P2663R7
P2933R4
A utility for creating execution environmentsP3325R5
constexpr for exception types, e.g. std::bad_alloc, std::bad_cast etc.  (FTM)*P3068R6
P3378R2
Trivial relocatability traits and operations  (FTM)*P2786R13
Defang and deprecate std::memory_order::consumeP3475R1
Put std::monostate in <utility>P0472R3152119.50*
std::indirect  (FTM)*P3019R14
std::polymorphic  (FTM)*P3019R14
More constexpr for containers and container adaptors:

std::deque, std::flat_map, std::flat_multimap, std::flat_set, std::flat_multiset, std::forward_list, std::list, std::map, std::multimap, std::queue, std::priority_queue, std::set, std::multiset, std::stack, std::unordered_map, std::unordered_multimap, std::unordered_set, and std::unordered_multiset
  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*

P3372R3
constexpr std::inplace_vector for non-trivial types  (FTM)*P3074R7
std::ranges::to_input_view  (FTM)*P3137R315
std::ranges::approximately_sized_range and std::ranges::reserve_hint  (FTM)*P2846R6
<hive>: A bucket-based container that re-uses memory locations from erased elements  (FTM)*P0447R28
<contracts>: Contract-violation handling support  (FTM)*P2900R14
Standard library hardening  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*P3471R415 (partial)*19.44* (partial)*
Freestanding library: <algorithm>, <numeric>, <random>, (<execution>, <memory>)
  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*
P2976R1
DR20: Converting contiguous iterators to pointersP3349R015
 

C++26 feature
 

Paper(s)
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*

[edit] C++23 features

[edit] C++23 core language features

C++23 feature

 
Paper(s)

 
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
Literal suffix for (signed) size_t  (FTM)*P0330R8111319.43*13.1.6*6.52022.223.9
Make () more optional for lambdasP1102R2111319.44*13.1.6*6.32022.222.5
if consteval  (FTM)*P1938R3121419.44*14.0.0*6.32022.224.1
Removing Garbage Collection SupportP2186R212N/A19.30*N/AN/A
Narrowing contextual conversions in static_assert and constexpr ifP1401R5913 (partial)*
14
14.0.0*2022.220.7
Trimming whitespaces before line splicingP2223R2YesYesYes6.72022.2Yes
Make declaration order layout mandatedP1847R4YesYesYesYes2022.2Yes
Removing mixed wide string literal concatenationP2201R1YesYesYesYesYesYesYes
Explicit object member functions (deducing this)  (FTM)*P0847R71418
19*
19.32*
(partial)*
19.43*
6.322.5
auto(x) and auto{x}  (FTM)*P0849R8121514.0.3*6.42022.223.3
#elifdef and #elifndefP2334R1121319.40*13.1.6*6.52022.223.9
Non-literal variables (and labels and gotos) in constexpr functions  (FTM)*P2242R3121519.43*14.0.3*6.32022.222.5
Consistent character literal encodingP2316R2YesYes19.30*YesYes2022.2Yes
Character sets and encodingsP2314R410YesYesYes2022.2Yes
Extend init-statement (of for loop) to allow alias-declarationP2360R0121414.0.0*2022.2
Multidimensional subscript operator  (FTM)*P2128R6121519.42*14.0.3*2022.2
Attributes on lambdasP2173R191319.44*13.1.6*6.62022.222.5
#warningP2437R1Yes*Yes15.0.0*6.52023.2Yes
Remove non-encodable wide character literals and multicharacter wide character literalsP2362R3131415.0.0*6.72023.2
Labels at the end of compound statementsP2324R2131616.0.0*6.52023.223.9
Delimited escape sequencesP2290R3131515.0.0*6.72023.2
Named universal character escapes  (FTM)*P2071R2131515.0.0*6.72023.2
Relaxing some constexpr restrictions  (FTM)*P2448R21317 (partial)
19
2024.0 (partial)
Simpler implicit move  (FTM)*P2266R313136.72022.2
static operator()  (FTM)*P1169R4131619.44*16.0.0*6.72023.2
Requirements for optional extended floating-point typesP1467R913N/A6.4
Class template argument deduction from inherited constructorsP2582R114
Attribute [[assume]]P1774R81319
Support for UTF-8 as a portable source file encodingP2295R613*15*19.0 (Update 2)**15.0.0*2023.2
static operator[]  (FTM)*P2589R1131619.44*16.0.0*6.72023.2
Permitting static constexpr variables in constexpr functions  (FTM)*P2647R1131616.0.0*2023.2
Extending the lifetime of temporaries in range-based for loop initializer  (FTM)*P2644R1
P2718R0
CWG2659
1519
DR11: Change scope of lambda trailing-return-typeP2036R3
P2579R0
172023.2
DR20: Meaningful exportsP2615R11517 (partial)
DR20: consteval needs to propagate up  (FTM)*P2564R3141716.0.0*6.72024.0
DR98: C++ Identifier Syntax using Unicode Standard Annex 31P1949R7121414.0.0*6.42022.2
DR11: Allow duplicate attributesP2156R1111313.1.6*6.523.9
DR20: Adjusting the value of feature-test macro __cpp_conceptsP2493R01219.32*6.423.3
DR98: Relax requirements on wchar_t to match existing practicesP2460R2YesYesYes15.0.0*N/A2023.2
DR11: Using unknown pointers and references in constant expressionsP2280R41420*
DR20: The Equality Operator You Are Looking ForP2468R2131616.0.0*2023.2
DR20: char8_t Compatibility and Portability Fix  (FTM)*P2513R4131619.34*16.0.0*2023.2
DR98/11: Clarify reporting of diagnostic directives and allow static_assert of non-value-dependent expressions in a template contextCWG2518131716.0*
(partial)*
19.40*
 

C++23 feature
 

Paper(s)
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray

[edit] C++23 library features

C++23 feature

 
Paper(s)

 
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
Stacktrace library  (FTM)*P0881R7
P2301R1
12 (partial)*
14*
19.34*
<stdatomic.h>  (FTM)*P0943R6121519.31*14.0.3*
std::is_scoped_enum  (FTM)*P1048R1111219.30*13.0.0*
std::basic_string::contains(), std::basic_string_view::contains()  (FTM)*P1679R3111219.30*13.0.0*
std::to_underlying  (FTM)*P1682R3111319.30*13.1.6*
Relaxing requirements for time_point<>::clockP2212R2N/AN/AN/AN/A
Providing size feedback in the Allocator interface  (FTM)*P0401R61519.30*14.0.3*
<spanstream>: string-stream with std::span-based buffer  (FTM)*P0448R41219.31*
std::out_ptr(), std::inout_ptr()  (FTM)*P1132R8141919.30*
constexpr type_info::operator==()  (FTM)*P1328R1121719.33**
19.34*
15.0.0*
Iterator pair constructors for std::stack and std::queue  (FTM)*P1425R4121419.31*14.0.3*
Non-deduction context for allocators in container deduction guidesP1518R212*13*19.31**13.1.6**
ranges::starts_with() and ranges::ends_with()  (FTM)*P1659R317 (partial)*
18
19.31*16.0.0*
Prohibiting std::basic_string and std::basic_string_view construction from nullptrP2166R1121319.30*13.1.6*
std::invoke_r()  (FTM)*P2136R3121719.31*15.0.0*
Range constructor for std::basic_string_viewP1989R2111419.30*14.0.3*
Default template arguments for std::pair's forwarding constructorP1951R1141419.30*14.0.3*
Remove Garbage Collection and Reachability-Based Detection (library support)P2186R2121419.30*14.0.3*
zip: views::zip, views::zip_transform, views::adjacent, and views::adjacent_transform  (FTM)*P2321R21315 (partial)*19.33*(partial)***
19.37*
14.0.3*
Heterogeneous erasure overloads for associative containers  (FTM)*P2077R319.32*
std::byteswap()  (FTM)*P1272R4121419.31*14.0.3*
Printing volatile T*P1147R111.31419.31*14.0.3*
basic_string::resize_and_overwrite()  (FTM)*P1072R10121419.31*14.0.3*
Monadic operations for std::optional  (FTM)*P0798R8121419.32*14.0.3*
std::move_only_function  (FTM)*P0288R91219.32*
Add a conditional noexcept specification to std::exchangeP2401R0121419.25*14.0.3*
Require std::span & std::basic_string_view to be TriviallyCopyableP2251R1YesYesYesYes
Clarifying the status of the “C headers”P2340R1YesYesYesYes
<expected>  (FTM)*P0323R12
P2549R1
121619.33*15.0.0*
constexpr for <cmath> and <cstdlib>  (FTM)*P0533R94.6 (partial)*
std::unreachable()  (FTM)*P0627R6121519.32*14.0.3*
Deprecating std::aligned_storage and std::aligned_unionP1413R3131619.33*
std::reference_constructs_from_temporary & std::reference_converts_from_temporary  (FTM)*P2255R213 (partial)*
14
21 (partial)*
constexpr std::unique_ptr  (FTM)*P2273R3121619.33*15.0.0*
Constructing containers and strings from ranges with ranges::to(), tagged constructors, insert and assign member functions  (FTM)*  (FTM)*P1206R714 (partial)*
15
1719.34*15.0.0*
Pipe support for user-defined range adaptors (ranges::range_adaptor_closure, std::bind_back)  (FTM)*  (FTM)*P2387R313 (partial)*
14
1919.34*
ranges::iota(), ranges::shift_left(), and ranges::shift_right()  (FTM)*  (FTM)*P2440R113 (partial)*19.34*
views::join_with  (FTM)*P2441R21319.34*
views::chunk and views::slide  (FTM)*  (FTM)*P2442R11319.33*
views::chunk_by  (FTM)*P2443R1131819.33*16.0.0*
std::mdspan: a non-owning multidimensional array reference  (FTM)*P0009R18
P2599R2
P2604R0
P2613R1
P2763R1
17 (partial)*
18
19.39*15.0.0*
<flat_map>  (FTM)*P0429R91520
<flat_set>  (FTM)*P1222R41521
ranges::find_last(), ranges::find_last_if(), and ranges::find_last_if_not()  (FTM)*P1223R5131919.36*
Freestanding Library: Easy <utility>, <ranges>, and <iterator>P1642R1113*N/A
views::stride  (FTM)*P1899R31319.34*
Compatibility between std::tuple and tuple-like objects  (FTM)*P2165R4142.9 (partial)*19.36* (partial)*
19.37*
partial*
Rectifying constant iterators, sentinels, and ranges. views::as_const  (FTM)*P2278R41319.35* (partial)*
19.36*
Formatting Ranges  (FTM)*P2286R815 (partial)*
15.2
1619.37*(partial)*
19.39*(partial)*
19.41*(partial)*
19.42*
15.0.0*
Improve default container formatting  (FTM)*P2585R11516 (partial)*
17
19.42*15.0.0*
Formatted output library <print>  (FTM)*P2093R14
P2539R4
1417 (partial)*
18
19.37*15.0.0**
16.0.0*
Formatting std::thread::id and std::stacktrace  (FTM)*P2693R11417 (partial)*19.38*15.0.0*
constexpr for integral overloads of std::to_chars() and std::from_chars()  (FTM)*P2291R3131619.34*15.0.0*
ranges::contains() and ranges::contains_subrange()  (FTM)*P2302R41318 (partial)*
19
19.34*16.0.0**
Ranges fold algorithms  (FTM)*P2322R61319.35*
views::cartesian_product  (FTM)*P2374R4
P2540R1
1319.37*
Adding move-only types support for comparison concepts (equality_comparable, totally_ordered, three_way_comparable)  (FTM)*P2404R319.36*
Ranges iterators as inputs to non-ranges algorithms  (FTM)*P2408R519.34*
constexpr std::bitset  (FTM)*P2417R2131619.34*15.0.0*
basic_string::substr() &&P2438R21619.34*15.0.0*
views::as_rvalue  (FTM)*P2446R2131619.34*15.0.0*
Standard Library Modules  (FTM)*P2465R315*17 (partial)*19.35*
(partial)*
19.36*
std::forward_like()  (FTM)*P2445R1141619.34*15.0.0*
Support exclusive mode for std::fstream  (FTM)*P2467R1121819.36*16.0.0*
views::repeat  (FTM)*P2474R2131719.36*15.0.0*
Relaxing range adaptors to allow for move-only types  (FTM)*P2494R2141719.34*15.0.0*
std::basic_string_view range constructor should be explicitP2499R012.21619.34*15.0.0*
std::generator: synchronous coroutine generator for ranges  (FTM)*P2502R2
P2787R0
1419.43*
Add a conditional noexcept specification to std::applyP2517R1101819.34*16.0.0*
Explicit lifetime management (std::start_lifetime_as)  (FTM)*P2590R2
P2679R2
Clarify handling of encodings in localized formatting of chrono types  (FTM)*P2419R215*19.34**
std::move_iterator should not always be input_iterator  (FTM)*P2520R012.3*17*19.34**15.0.0*
Deduction guides update for explicit object parameter call operatorsLWG36171419.34*
Deduction guides update for static operator()P1169R4131619.39*15.0.0*
Standard names and library support for extended floating-point typesP1467R91319.37**
Monadic operations for std::expected  (FTM)*P2505R5131719.36*15.0.0*
views::enumerate  (FTM)*P2164R91319.37*
std::is_implicit_lifetime  (FTM)*P2674R120
std::common_reference_t of std::reference_wrapper should be a reference type  (FTM)*  (FTM)*P2655R319.37*
Disallowing user specialization of std::allocator_traitsP2652R21919.37*
Deprecating std::numeric_limits::has_denormP2614R21819.37*16.0.0*
Making Multi-Param Constructors Of views explicitP2711R117 (partial)*19.36**15.0.0*
DR20: Relaxing Ranges Just A Smidge  (FTM)*P2609R3152019.37*
DR20: Stashing Stashing Iterators For Proper FlatteningP2770R0141819.37*
DR17: std::visit() for classes derived from std::variant  (FTM)*P2162R211.31319.20**
19.30*
13.1.6*
DR20: Conditionally borrowed rangesP2017R1111619.30*
DR20: Repairing input range adaptors and std::counted_iteratorP2259R11219.30*(partial)*
19.31*
DR20: views::join should join all views of rangesP2328R111.21519.30*14.0.3*
DR20: view does not require default_initializable  (FTM)*P2325R311.31619.30*15.0.0*
DR20: Range adaptor objects bind arguments by valueP2281R1111419.29 (16.10)*
(partial)*
19.31*
14.0.3*
DR20: constexpr for std::optional and std::variant  (FTM)*  (FTM)*P2231R111.3 (partial)*
12
13 (partial)*
19
19.31*13.1.6* (partial)
DR20: views::lazy_split and redesigned views::splitP2210R2121619.31*15.0.0*
DR20: Fix ranges::istream_viewP2432R1121619.31*15.0.0*
DR20: view with ownership  (FTM)*P2415R2121419.31*14.0.3*
DR20: Fixing locale handling in chrono formatters  (FTM)*P2372R3
P2418R2
1319.31*
DR20: Cleaning up integer-class typesP2393R119.32*
DR20: Compile-time format string checks; Reducing binary code size of std::format() family  (FTM)*P2216R31314 (partial)*
15
19.32*14.0.3*
DR20: Add support for non-const-formattable types to std::formatP2418R2131519.32*14.0.3*
DR20: std::basic_format_stringP2508R1131519.35*14.0.3*
DR20: Poison Pills are Too Toxic  (FTM)*P2602R2141919.36*
DR20: std::format fill character allowancesP2572R1141719.37*
DR20: Improving std::format's width estimationP2675R1141719.38*
DR20: std::barrier's phase completion guarantees  (FTM)*P2588R319.28 (16.8)**
19.36*
 

C++23 feature
 

Paper(s)
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*

[edit] C++20 features

[edit] C++20 core language features

C++20 feature

 
Paper(s)

 
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
Allow Lambda capture [=, this]P0409R28619.22*10.0.0*5.12021.120.712.011.0
__VA_OPT__P0306R4
P1042R1
8 (partial)*
10 (partial)*
12
919.25*11.0.3*5.12021.120.712.011.0
Designated initializers  (FTM)*P0329R44.7 (partial)*
8
3.0 (partial)*
10
19.21*12.0.0*5.12021.120.712.011.0
template-parameter-list for generic lambdas  (FTM)*P0428R28919.22*11.0.0*5.12021.120.712.011.0
Default member initializers for bit-fieldsP0683R18619.25*10.0.0*5.12021.120.712.011.0
Initializer list constructors in class template argument deductionP0702R18619.14*Yes5.02021.120.712.011.0
const&-qualified pointers to membersP0704R18619.0 (2015)*10.0.0*5.12021.120.712.011.0
Concepts  (FTM)*P0734R05*
10
1019.23* (partial)*
19.30*
12.0.0* (partial)6.12023.1*20.1112.011.0
Lambdas in unevaluated contextsP0315R4913 (partial)*
14 (partial)*
17
19.28 (16.8)*13.1.6* (partial)6.22023.1 (partial)
2024.0
20.712.0
Three-way comparison operator  (FTM)*P0515R3108 (partial)
10
19.20*12.0.0*5.12021.120.712.011.0
DR11: Simplifying implicit lambda captureP0588R1819.24*5.12021.120.712.0
init-statements for range-based forP0614R19819.25*11.0.0*6.02021.720.1112.011.0
Default constructible and assignable stateless lambdasP0624R29819.22*10.0.1*5.12021.120.712.011.0
Type mismatch of defaulted special member functionsP0641R29 (partial)*819.0 (2015)* (partial)*10.0.1*5.12021.120.712.011.0
Access checking on specializationsP0692R1Yes8 (partial)
14
19.26*14.0.0*5.12021.120.712.0
ADL and function templates that are not visibleP0846R09919.21*11.0.3*5.12021.120.712.011.0
DR11: Specify when constexpr function definitions are needed for constant evaluation  (FTM)*P0859R05.2 (partial)*
9
819.27* (partial)*
19.31**
11.0.0*(partial)12.011.0
Attributes [[likely]] and [[unlikely]]P0479R591219.26*13.0.0*5.12021.720.712.0
Make typename more optionalP0634R391619.29 (16.10)*16.0.0*5.12023.120.712.0
Pack-expansions in lambda init-captures  (FTM)*P0780R29919.22*11.0.3*6.12021.720.1112.011.0
Attribute [[no_unique_address]]P0840R29919.28 (16.9)**11.0.3*5.12021.120.712.011.0
Conditionally trivial special member functions  (FTM)*P0848R3101619.28 (16.8)*6.12021.720.1112.0
DR17: Relaxing the structured bindings customization point finding rulesP0961R18819.20*10.0.1*5.12021.120.712.011.0
DR11: Relaxing the range-for loop customization point finding rulesP0962R18819.25*11.0.0*5.12021.120.712.011.0
DR17: Allow structured bindings to accessible membersP0969R08819.20*10.0.1*5.12021.120.712.011.0
Destroying operator delete  (FTM)*P0722R39619.27*10.0.0*6.12023.120.1112.011.0
Class types in Constant template parametersP0732R2912 (partial)19.26*(partial)*
19.28 (16.9)*
13.0.0* (partial)6.22023.1 (partial)21.312.0
Deprecate implicit capture of this via [=]P0806R29719.22*10.0.1*5.120.712.011.0
explicit(bool)  (FTM)*P0892R29919.24*11.0.3*5.12021.120.712.011.0
Integrating feature-test macrosP0941R253.419.15* (partial)
19.20*
Yes5.02021.120.712.011.0
Prohibit aggregates with user-declared constructorsP1008R19819.20*10.0.1*5.12021.120.712.011.0
constexpr virtual function  (FTM)*P1064R09919.28 (16.9)*11.0.3*5.12021.120.712.011.0
Consistency improvements for comparisonsP1120R0108 (partial)
10
19.22*12.0.0*5.12023.120.712.011.0
char8_t  (FTM)*P0482R697*19.22*10.0.0*5.12021.120.712.011.0
std::is_constant_evaluated()  (FTM)*P0595R29919.25*11.0.3*5.119.121.112.011.0
constexpr try-catch blocksP1002R19819.25*10.0.1*5.12023.120.712.011.0
Immediate functions (consteval)  (FTM)*P1073R310 (partial)*
11
11 (partial)
14 (partial)*
17
19.28 (16.8)*
(partial)*

19.29 (16.10)*
11.0.3* (partial)
15.0.0*
5.12021.120.712.0
Nested inline namespacesP1094R29819.27*10.0.1*5.12021.120.712.011.0
Yet another approach for constrained declarationsP1141R2101019.26* (partial)
19.28 (16.9)*
12.0.5*6.12023.120.1112.011.0
Signed integers are two's complementP1236R199Yes11.0.3*N/A2023.1*yes*12.011.0
dynamic_cast and polymorphic typeid in constant expressionsP1327R110919.28 (16.9)*11.0.3*5.12021.120.712.011.0
Changing the active member of a union inside constexpr  (FTM)*P1330R09919.10*11.0.3*5.12021.120.712.011.0
Coroutines  (FTM)*  (FTM)*P0912R5
LWG3393
108 (partial)
17 (partial)*
19.0 (2015)* (partial)
19.10**
19.28 (16.8)*
10.0.1* (partial)5.12021.123.3*12.0 (host code only)
Parenthesized initialization of aggregates  (FTM)*P0960R3101619.28 (16.8)*16.0.0*5.12021.120.712.0
DR11: Array size deduction in new-expressionsP1009R211919.27*11.0.3*5.12021.120.712.011.0
Modules  (FTM)*P1103R311 (partial)8 (partial)19.0 (2015)* (partial)
19.10**
19.28 (16.8)*
10.0.1* (partial)2023.1 (partial)
Stronger Unicode requirementsP1041R4
P1139R2
10Yes19.0 (2015)**
19.26**
YesN/A2023.1*Yes12.011.0
<=> != ==P1185R2101019.22*12.0.0*5.12021.120.712.011.0
DR11: Explicitly defaulted functions with different exception specificationsP1286R210919.28 (16.8)*11.0.3*5.12021.120.712.011.0
Lambda capture and storage class specifiers of structured bindingsP1091R3
P1381R1
108 (partial)
16
19.11**
19.24**
16.0.0*5.12021.120.712.0
Permit conversions to arrays of unknown boundP0388R4101419.27*14.0.0*6.02021.520.1112.0
constexpr container operations  (FTM)*P0784R7101019.28 (16.9)*12.0.0*6.02021.520.1112.011.0
Deprecating some uses of volatileP1152R4101019.27*12.0.0*6.02021.520.1112.011.0
constinit  (FTM)*P1143R2101019.29 (16.10)*12.0.0*6.12021.720.1112.011.0
Deprecate comma operator in subscriptsP1161R310919.25*11.0.3*6.02021.720.1112.011.0
[[nodiscard]] with messageP1301R410919.25*11.0.3*6.02021.520.1112.011.0
Trivial default initialization in constexpr functionsP1331R2101019.27*12.0.0*6.12021.720.1112.011.0
Unevaluated asm-declaration in constexpr functionsP1668R1101019.28 (16.9)*12.0.0*6.12021.720.1112.011.0
using enum  (FTM)*P1099R5111319.24*13.1.6*6.32023.122.512.0
Synthesizing Three-way comparison for specified comparison categoryP1186R3111019.24*12.0.0*6.02021.520.1112.011.0
DR17: [[nodiscard]] for constructorsP1771R110919.24*11.0.3*6.02021.520.1112.011.0
class template argument deduction for alias templates  (FTM)*P1814R0101919.27*6.523.912.0
class template argument deduction for aggregates  (FTM)*P1816R0
P2082R1
10*
11*
1719.27*6.32023.1 (partial)*
2024.1
23.312.0
DR11: Implicit move for more local objects and rvalue referencesP1825R011*1319.24*13.1.6*6.02021.520.1112.0
Allow defaulting comparisons by valueP1946R0101019.25*12.0.0*6.12021.720.1112.011.0
Remove std::weak_equality and std::strong_equalityP1959R0101019.25*12.0.0*6.12021.720.1112.011.0
Inconsistencies with constant template parameters  (FTM)*P1907R110 (partial)
11
18 (partial)*19.26*13.1.6* (partial)6.22023.1 (partial)21.312.0
DR98: Pseudo-destructors end object lifetimesP0593R61111Yes12.0.5*N/A2023.1*Yes12.011.0
DR11: Converting from T* to bool should be considered narrowingP1957R210*
11*
1119.27*12.0.5*6.112.011.0
 

C++20 feature
 

Paper(s)
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray

[edit] C++20 library features

C++20 feature

 
Paper(s)

 
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
std::endian  (FTM)*P0463R18719.22*10.0.0*
Extending std::make_shared() to support arrays  (FTM)*P0674R1121519.27*14.0.3*
Floating-point atomic  (FTM)*P0020R6101819.22*16.0.0*
Synchronized buffered (std::basic_osyncstream)  (FTM)*P0053R7111819.29 (16.10)*
constexpr for <algorithm> and <utility>  (FTM)*P0202R3108 (partial)
12
19.26*10.0.1* (partial)
13.0.0*
More constexpr for <complex>  (FTM)*P0415R197 (partial)
16
19.27*10.0.0* (partial)
15.0.0*
Make std::memory_order a scoped enumerationP0439R09919.25*11.0.3*
String prefix and suffix checking: string(_view) ::starts_with / ends_with  (FTM)*P0457R29619.21*10.0.0*
Library support for operator<=> <compare>  (FTM)*P0768R1107 (partial)
12 (partial)*
17
19.20* (partial)
19.28 (16.9)*
13.0.0*
std::remove_cvref  (FTM)*P0550R29619.20*10.0.0*
[[nodiscard]] in the standard libraryP0600R197 (partial)
16
19.13* (partial)
19.22*
10.0.0* (partial)
15.0.0*
Using std::move in numeric algorithmsP0616R091219.23*13.0.0*
Utility to convert a pointer to a raw pointer  (FTM)*P0653R28619.22*Yes
Atomic std::shared_ptr and std::weak_ptr  (FTM)*P0718R21219.27*
std::span  (FTM)*P0122R710719.26*10.0.0*
Calendar and Time zone  (FTM)*P0355R711 (partial)*
13 (partial)*
14
7 (partial)
19 (partial)*
19.29 (16.10)*10.0.0* (partial)
<version>P0754R29719.22*10.0.0*
Comparing unordered containersP0809R0YesYes16.0*Yes
ConstexprIterator requirements  (FTM)*  (FTM)*P0858R091219.11*13.0.0*
std::basic_string::reserve() should not shrinkP0966R111819.25*10.0.1*
Atomic Compare-And-Exchange with padding bitsP0528R31319.28 (16.8)*
std::atomic_ref  (FTM)*P0019R8101919.28 (16.8)*
contains() member function of associative containers, e.g. std::map::contains()P0458R291319.21*13.1.6*
DR11: Guaranteed copy elision for piecewise constructionP0475R19Yes19.29 (16.10)*Yes
std::bit_cast()  (FTM)*P0476R2111419.27*14.0.3*
Integral power-of-2 operations:

std::bit_ceil(), std::bit_floor(), std::bit_width(), std::has_single_bit()  (FTM)*

P0556R3
P1956R1
9*
10*
9*
12*
19.25**
19.27**
19.28 (16.8)*
11.0.3**
13.0.0**
Improving the return value of erase-like algorithms  (FTM)*P0646R191019.21*12.0.0*
std::destroying_delete_t  (FTM)*P0722R39919.27*11.0.3*
std::is_convertible  (FTM)*P0758R19919.23*11.0.3*
Add std::shift_left/right to <algorithm>  (FTM)*P0769R2101219.21*13.0.0*
Constexpr for std::swap() and swap related functionsP0879R0101319.26*13.1.6*
std::type_identity  (FTM)*P0887R19819.21*10.0.1*
Concepts library  (FTM)*P0898R3101319.23*13.1.6*
constexpr comparison operators for std::arrayP1023R010819.27*10.0.1*
std::unwrap_ref_decay and std::unwrap_reference  (FTM)*P0318R19819.21*10.0.1*
std::bind_front()  (FTM)*P0356R591319.25*13.1.6*
std::reference_wrapper for incomplete typesP0357R39819.26*10.0.1*
Fixing operator>>(basic_istream&, CharT*)P0487R111819.23*10.0.1*
Library support for char8_t  (FTM)*P0482R698 (partial)
16
19.22*10.0.1* (partial)
15.0.0*
Utility functions to implement uses-allocator constructionP0591R491619.29 (16.10)*15.0.0*
DR17: std::variant and std::optional should propagate copy/move trivialityP0602R48.3819.11*10.0.1*
DR17: A sane std::variant converting constructorP0608R310919.29 (16.10)**
19.42**
11.0.3*
std::function's move constructor should be noexceptP0771R17.2619.22*Yes
The One Ranges Proposal  (FTM)*P0896R41013 (partial)
15*
19.29 (16.10)*14.0.3*
Heterogeneous lookup for unordered associative containers  (FTM)*P0919R3
P1690R1
111219.23* (P0919R3)
19.25* (P1690R1)
13.0.0*
<chrono> zero(), min(), and max() should be noexceptP0972R09819.14*10.0.1*
constexpr in std::pointer_traits  (FTM)*P1006R19819.26*10.0.1*
std::assume_aligned()  (FTM)*P1007R39*
11
1519.28 (16.9)*14.0.3*
Smart pointer creation with default initialization (e.g. make_unique_for_overwrite)  (FTM)*P1020R1
P1973R1
11*
12*
1619.28 (16.9)*15.0.0*
Misc constexpr bits  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*P1032R1101319.28 (16.8)*13.1.6*
Remove comparison operators of std::spanP1085R210819.26*10.0.1*
Make stateful allocator propagation more consistent for operator+(basic_string)P1165R1101519.26*14.0.3*
Consistent container erasure, e.g. std::erase(std::vector), or std::erase_if(std::map)  (FTM)*P1209R0
P1115R3
9*
10*
8*
11*
19.25**
19.27**
10.0.1**
12.0.5**
Standard library header unitsP1502R11119.29 (16.10)*
polymorphic_allocator<> as a vocabulary type  (FTM)*P0339R691619.28 (16.9)*15.0.0*
std::execution::unseq  (FTM)*P1001R291719.28 (16.8)*
std::lerp() and std::midpoint()  (FTM)*P0811R39919.23* (partial)
19.28 (16.8)*
11.0.3*
Usability enhancements for std::spanP1024R3109*
14
19.26*11.0.3*
DR17: Make std::create_directory() intuitiveP1164R18.31219.20*13.0.0*
std::ssize() and unsigned extent for std::span  (FTM)*P1227R210919.25*11.0.3*
Traits for (un)bounded arrays  (FTM)*P1357R19919.25*11.0.3*
std::to_array()  (FTM)*P0325R4101019.25*12.0.0*
Efficient access to std::basic_stringbuf’s bufferP0408R7111719.29 (16.10)*15.0.0*
Layout-compatibility and pointer-interconvertibility traits  (FTM)*  (FTM)*P0466R51219.29 (16.10)**
Bit operations: std::

rotl(), rotr(), countl_zero(), countl_one(), countr_zero(), countr_one(), popcount()  (FTM)*

P0553R49919.25**
19.28 (16.8)*
11.0.3*
Mathematical constants  (FTM)*P0631R8101119.25*12.0.5*
Text formatting  (FTM)*P0645R101314**
17
19.29 (16.10)*15.0.0*
std::stop_token and std::jthread  (FTM)*P0660R101017
(partial)*

20*
19.28 (16.9)*
constexpr std::allocator and related utilities  (FTM)*P0784R7101219.29 (16.10)*13.0.0*
constexpr std::string  (FTM)*P0426R1
P1032R1
P0980R1
121519.29 (16.10)*
19.30**
14.0.3*
constexpr std::vector  (FTM)*P1004R2121519.29 (16.10)*
19.30**
14.0.3*
Input range adaptorsP1035R7101619.29 (16.10)*15.0.0*
constexpr std::invoke() and related utilitiesP1065R2101219.28 (16.8)*13.0.0*
Atomic waiting and notifying, std::counting_semaphore, std::latch and std::barrier  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*  (FTM)*P1135R6111119.28 (16.9)*13.1.6*
std::source_location  (FTM)*P1208R61115*
(partial)
16
19.29 (16.10)*15.0.0*
Adding <=> to the standard libraryP1614R21014*
(partial)
17*
(partial)
19
19.29 (16.10)*13.1.6* (partial)
constexpr default constructor of std::atomic and std::atomic_flag  (FTM)*P0883R2101319.26*13.1.6*
constexpr for numeric algorithms  (FTM)*P1645R1101219.26*13.0.0*
Safe integral comparisons  (FTM)*P0586R2101319.27*13.1.6*
 

C++20 feature
 

Paper(s)
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*

[edit] Older standards

[edit] See also

Feature testing (C++20)A set of preprocessor macros to test the corresponding to C++ language and library features
C documentation for compiler support