C++ 20 Features
Following is the status and version of compiler support for C++ 20 Features:
Language Feature | Standard # | ICC 2021.6 | ICC 2021.7 (oneAPI 2022.3) | ICX 2023.2 (oneAPI 2023.2) | ICX 2024.0 (oneAPI 2024.0) | ICX 2024.1 (oneAPI 2024.1) |
Default member initializers for bit-fields | P0683R1 | Yes | Yes | Yes | Yes | Yes |
Fixing const qualified-pointers-to-members | P0704R1 | Yes | Yes | Yes | Yes | Yes |
Allow lambda capture [=, this] | P0409R2 | Yes | Yes | Yes | Yes | Yes |
__VA_OPT__ : for preprocessor comma elision | P1042R1 | Yes | Yes | Yes | Yes | Yes |
__VA_OPT__: Comma omission and comma deletion | P0306R4 | Yes | Yes | Yes | Yes | Yes |
Designated initializers | P0329R4 | Yes | Yes | Yes | Yes | Yes |
Familiar template syntax for generic lambdas | P0428R2 | Yes | Yes | Yes | Yes | Yes |
Constructor Template Argument Deduction | P0702R1 | Yes | Yes | Yes | Yes | Yes |
Concepts: C++ Extensions for Concepts | P0734R0 | Yes | No | Yes | Yes | Yes |
Concepts: Wording for “functionality gaps in constraints” | P0857R0 | No | No | Yes | Yes | Yes |
Concepts: Today's return-type-requirements Are Insufficient | P1084R2 | No | No | Yes | Yes | Yes |
Concepts: On the non-uniform semantics of return-type-requirements | P1452R2 | No | No | Yes | Yes | Yes |
Concepts: Using unconstrained template parameters with constrained templates | P1616R1 | No | No | Yes | Yes | Yes |
Concepts: Declaration matching for non-dependent requires-clauses | P1980R0 | No | No | No | No | No |
Concepts: Yet another approach for constrained declarations | P1141R2 | No | No | Yes | Yes | Yes |
Concepts: US105 Check satisfaction of constraints for non-templates when forming pointer to function | P1972R0 | No | No | No | No | No |
Concepts: Disallow changing concept values | P2104R0 | No | No | No | No | No |
Concepts: Disambiguating Nested-Requirements | P2092R0 | No | No | Yes | Yes | Yes |
Concepts: Partial ordering of rewritten operator candidates resulting from constrained templates | P2113R0 | No | No | Yes | Yes | Yes |
Concepts: Parameter mapping for non-dependent entities (CA107) & Comparing types and type-constraints (US117) | P2103R0 | No | No | No | No | No |
Concepts: CA 104 Clarify declaration matching and partial ordering requiring substitution into constraints | P2103R0 | No | No | No | No | No |
Concepts: US115 Hidden non-template friends need a requires-clause | P2103R0 | No | No | No | No | No |
Range-based for statements with initializer | P0614R1 | No | Yes | Yes | Yes | Yes |
Simplifying implicit lambda capture | P0588R1 | Yes | Yes | Yes | Yes | Yes |
ADL and Function Templates that are not visible | P0846R0 | Yes | Yes | Yes | Yes | Yes |
const mismatch with defaulted copy constructor (core issue 1331) | P0641R2 | Yes | Yes | Yes | Yes | Yes |
When are constexpr member functions defined? (core issue 1581) | P0859R0 | No | No | No | No | No |
Access Checking on Specializations | P0692R1 | Yes | Yes | Yes | Yes | Yes |
Default constructible and assignable stateless lambdas | P0624R2 | Yes | Yes | Yes | Yes | Yes |
Spaceship: Three-way comparison operator | P0515R3 | Yes | Yes | Yes | Yes | Yes |
Spaceship: Symmetry for spaceship | P0905R1 | Yes | Yes | Yes | Yes | Yes |
Spaceship: <=> != == | P1185R2 | Yes | Yes | Yes | Yes | Yes |
Spaceship: Spaceship needs a tune-up | P1630R1 | Yes | Yes | Yes | Yes | Yes |
Spaceship: Consistency improvements for comparisons | P1120R0 | No | No | Yes | Yes | Yes |
Spaceship: When do you actually use <=>? | P1186R3 | Yes | Yes | Yes | Yes | Yes |
Spaceship: Remove std::weak_equality and std::strong_equality | P1959R0 | No | Yes | Yes | Yes | Yes |
Spaceship: Consistent defaulted comparisons | P2085R0 | No | Yes | Yes | Yes | Yes |
Spaceship: Defaulted comparison specification cleanups | P2002R1 | No | Yes | Partial | Yes | Yes |
Wording for lambdas in unevaluated contexts | P0315R4 | No | No | Partial | Yes | Yes |
Deprecate POD | P0767R1 | Yes | Yes | Yes | Yes | Yes |
Language support for empty objects | P0840R2 | Yes | Yes | Yes | Yes | Yes |
Relaxing the range-for loop customization point finding rules | P0962R1 | Yes | Yes | Yes | Yes | Yes |
Allow structured bindings to accessible members | P0969R0 | Yes | Yes | Yes | Yes | Yes |
Relaxing structured bindings customization point | P0961R1 | Yes | Yes | Yes | Yes | Yes |
Make "typename" more optional | P0634R3 | No | No | Yes | Yes | Yes |
Lambda init-capture: Allow pack expansion in lambda init-capture | P0780R2 | No | Yes | Yes | Yes | Yes |
Lambda init-capture: Resolve lambda init-capture pack grammar (CWG2378) | P2095R0 | No | Yes | No | No | No |
[[likely]] and [[unlikely]] attributes | P0479R5 | No | Yes | Yes | Yes | Yes |
Deprecate implicit capture of this via [=] | P0806R2 | No | No | No | No | No |
Non-Type Template Parameters: Class Types in Non-Type Template Parameters | P0732R2 | No | No | Partial | Partial | Partial |
Non-Type Template Parameters: Inconsistencies with non-type template parameters | P1907R1 | No | No | Partial | Partial | Partial |
Atomic Padding Bits | P0528R3 | N/A | N/A | No | No | No |
Efficient sized delete for variable sized classes | P0722R3 | No | No | Yes | Yes | Yes |
Allowing Virtual Function Calls in Constant Expressions | P1064R0 | Yes | Yes | Yes | Yes | Yes |
Prohibit aggregates with user-declared constructors | P1008R1 | Yes | Yes | Yes | Yes | Yes |
Integrating feature-test macros into the C++ WD | P0941R2 | Yes | Yes | see doc | see doc | see doc |
explicit(bool) | P0892R2 | Yes | Yes | Yes | Yes | Yes |
Checking for abstract class types | P0929R2 | No | No | No | No | No |
Coroutines: US065: Apply Coroutines TS issue 24 from P0664R8 | P0664R8 | No | No | No | No | No |
Coroutines: Merge Coroutines TS into C++20 working draft | P0912R5 | Yes | Yes | Partial | Partial | Partial |
char8_t: A type for UTF-8 characters and strings | P0482R6 | Yes | Yes | Yes | Yes | Yes |
try-catch blocks in constexpr functions | P1002R1 | No | No | Yes | Yes | Yes |
Allowing dynamic_cast and polymorphic typeid in constant expressions | P1327R1 | Yes | Yes | Yes | Yes | Yes |
Immediate functions | P1073R3 | Yes | Yes | Yes | Yes | Yes |
std::is_constant_evaluated() | P0595R2 | Yes | Yes | Yes | Yes | Yes |
Nested inline namespaces | P1094R2 | Yes | Yes | Yes | Yes | Yes |
Changing an active union member in constant expressions | P1330R0 | Yes | Yes | Yes | Yes | Yes |
Missing Feature Test Macros | P1353R0 | Yes | Yes | Yes | Yes | Yes |
Alternative Wording for P0907R4 Signed Integers are Two's Complement | P1236R1 | N/A | N/A | Yes | Yes | Yes |
Variable like Declaration of structured bindings | P1091R3 | N/A | N/A | Yes | Yes | Yes |
Reference capture of structured bindings | P1381R1 | Yes | Yes | Yes | Yes | Yes |
Extending structured bindings to be more like variable declarations | P1091R3 | Yes | Yes | Partial | Partial | Partial |
Make char16_t/char32_t string literals be UTF-16/32 | P1041R4 | N/A | N/A | Yes | Yes | Yes |
Allow initializing aggregates from a parenthesized list of values | P0960R3 | Yes | Yes | Yes | Yes | Yes |
Fixing the wording of parenthesized aggregate-initialization | P1975R0 | No | No | Yes | Yes | Yes |
Array size deduction in new-expressions | P1009R2 | Yes | Yes | Yes | Yes | Yes |
Modules: Merging Modules | P1103R3 | No | No | Partial | Partial | Partial |
Modules: Dynamic Initialization Order of Non-Local Variables in Modules | P1874R1 | No | No | Partial | Partial | Partial |
Modules: Resolution to US086 | P1979R0 | No | No | No | No | No |
Modules: Mitigating minor modules maladies | P1766R1 | No | No | Yes | Yes | Yes |
Modules: Relaxing redefinition restrictions for re-exportation robustness | P1811R0 | No | No | No | No | No |
Modules: Recognizing Header Unit Imports Requires Full Preprocessing | P1703R1 | No | No | No | No | No |
Modules: Modules Dependency Discovery | P1857R3 | No | No | No | No | No |
Modules: Disallow "export import foo" outside of module interface | P2109R0 | No | No | No | No | No |
Modules: ABI isolation for member functions (in-class member function definitions not implicitly inline in named modules) | P1779R3 | No | No | No | No | No |
Modules: Merging of multiple definitions for unnamed unscoped enumerations | P2115R0 | No | No | Partial | Partial | Partial |
Modules: Translation-unit-local entities | P1815R2 | No | No | No | No | No |
Core Issue 1778: exception-specification in explicitly-defaulted functions | P1286R2 | Yes | Yes | Yes | Yes | Yes |
Deprecate uses of the comma operator in subscripting expressions | P1161R3 | No | Yes | Yes | Yes | Yes |
Permitting trivial default initialization in constexpr contexts | P1331R2 | No | Yes | Yes | Yes | Yes |
Interaction of memory_order_consume with release sequences | P0735R1 | N/A | N/A | |||
Conditionally Trivial Special Member Functions | P0848R3 | No | Yes | Partial | Partial | Partial |
[[nodiscard("should have a reason")]] | P1301R4 | Yes | Yes | Yes | Yes | Yes |
Using Enum | P1099R5 | No | No | Yes | Yes | Yes |
CTAD: Wording for class template argument deduction for aggregates | P1816R0 | No | No | No | Yes | Yes |
CTAD: Fixing CTAD for aggregates | P2082R1 | No | No | No | No | Yes |
Enabling constexpr intrinsics by permitting unevaluated inline-assembly in constexpr functions | P1668R1 | No | Yes | Yes | Yes | Yes |
Permit conversions to arrays of unknown bound | P0388R4 | Yes | Yes | Yes | Yes | Yes |
Adding the constinit keyword | P1143R2 | No | Yes | Yes | Yes | Yes |
Deprecating volatile | P1152R4 | Yes | Yes | Yes | Yes | Yes |
[[nodiscard]] for constructors | P1771R1 | Yes | Yes | Yes | Yes | Yes |
Wording for Class Template Argument Deduction for Alias Templates | P1814R0 | No | No | No | No | No |
Implicit move for more local objects and rvalue references | P1825R0 | Yes | Yes | Yes | Yes | Yes |
More constexpr containers | P0784R7 | Yes | Yes | Yes | Yes | Yes |
Allow defaulting comparisons by value | P1946R0 | No | Yes | Yes | Yes | Yes |
Fixing inconsistencies between constexpr and consteval functions | P1937R2 | No | No | Yes | Yes | Yes |
Reserving Attribute Namespaces for Future Use | P1908R1 | N/A | N/A | |||
Implicit creation of objects for low-level object manipulation | P0593R6 | N/A | N/A | Yes | Yes | Yes |
Use compiler option -std=c++20 (/Qstd=c++20) to enable C++20 features.
ICX is compiler based out of clang. Please see here for more detailed list.
Other relevant articles: