C++20 Features Supported by Intel® C++ Compiler

Published: 04/14/2020  

Last Updated: 04/12/2022

By Subarnarekha Ghosal

C++ 20 Features

Following is the status and version of compiler support for C++ 20 Features:

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


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:

  1. Intel Compiler C++11 support status
  2. Intel Compiler C++14 support status
  3. Intel Compiler C++17 support status

Product and Performance Information


Performance varies by use, configuration and other factors. Learn more at www.Intel.com/PerformanceIndex.