Modern C++ Language Features Compliance Status
Go Up to Modern C++
Contents
Below are the lists of Modern C++ features that are supported by the RAD Studio C++ compilers.
C++2c Features
Note:
C++2c
is expected to be C++26.Note: BCC64X is currently a Preview. The below status is aspirational but untested and is not a guarantee of the final support. BCC64X uses C++17 as its default language level, and the initial release is not planned to support higher language levels. To compile to C++2c, run bcc64x with
-std=c++2c
.Feature | C++2c Proposal Document | BCC32C/X | BCC64 | BCC64X |
---|---|---|---|---|
Remove undefined behavior from lexing | P2621R2 | ![]() |
![]() |
![]() |
Making non-encodable string literals ill-formed | P1854R4 | ![]() | ||
Unevaluated strings | P2361R6 | |||
Add @, $, and ` to the basic character set | P2558R2 | ![]() |
![]() |
![]() |
constexpr cast from void* | P2738R1 | ![]() | ||
On the ignorability of standard attributes | P2552R3 | |||
Static storage for braced initializers | P2752R3 | |||
User-generated static_assert messages | P2741R3 | ![]() | ||
Placeholder variables with no name | P2169R4 |
C++23 Features
Note: C+23 is partially supported by the Clang version that BCC64X is based on and the C+ RTL and STL (libc+) that it uses. We expect that any language feature supported by both the Clang and the libc+ in versions 15 and earlier, work correctly. But it is not supported, even at the unsupported level that a Preview implies. However, the Preview of the BCC64X compiler currently aims at C+17 as its language standard. You can use
-std=c++23
to change the target language compliance. C++20 Features
Note: C+20 is partially supported by the Clang version that BCC64X is based on and the C+ RTL and STL (libc+) that it uses. We expect that any language feature supported by both the Clang and the libc+ in versions 15 and earlier, work correctly. But it is not supported, even at the unsupported level that a Preview implies. However, the Preview of the BCC64X compiler currently aims at C+17 as its language standard. You can use
-std=c++20
to change the target language compliance. C++17 Features
Note: BCC64X is currently a Preview. The status below is aspirational but not guaranteed for the final release.
Feature | C++17 Proposal Document | BCC32C/X | BCC64 | BCC64X |
---|---|---|---|---|
New auto rules for direct-list-initialization | N3922 | ![]() |
![]() |
![]() |
static_assert with no message | N3928 | ![]() |
![]() |
![]() |
typename in a template template parameter | N4051 | ![]() |
![]() |
![]() |
Removing trigraphs | N4086 | ![]() |
![]() |
![]() |
Nested namespace definition | N4230 | ![]() |
![]() |
![]() |
Attributes for namespaces and enumerators | N4266 | ![]() |
![]() |
![]() |
u8 character literals | N4267 | ![]() |
![]() |
![]() |
Allow constant evaluation for all non-type template arguments | N4268 | ![]() |
![]() |
![]() |
Fold Expressions | N4295 | ![]() |
![]() |
![]() |
Remove Deprecated Use of the register Keyword | P0001R1 | ![]() |
![]() |
![]() |
Remove Deprecated operator++(bool) | P0002R1 | ![]() |
![]() |
![]() |
Removing Deprecated Exception Specifications from C++17 | P0003R5 | ![]() |
![]() |
![]() |
Make exception specifications part of the type system | P0012R1 | ![]() |
![]() |
![]() |
Aggregate initialization of classes with base classes | P0017R1 | ![]() |
![]() |
![]() |
Lambda capture of *this | P0018R3 | ![]() |
![]() |
![]() |
Using attribute namespaces without repetition | P0028R4 | ![]() |
![]() |
![]() |
Dynamic memory allocation for over-aligned data | P0035R4 | ![]() |
![]() |
![]() |
Unary fold expressions and empty parameter packs | P0036R0 | ![]() |
![]() |
![]() |
__has_include in preprocessor conditionals | P0061R1 | ![]() |
![]() |
![]() |
Template argument deduction for class templates | P0091R3 | ![]() |
![]() |
![]() |
Non-type template parameters with auto type | P0127R2 | ![]() |
![]() |
![]() |
Guaranteed copy elision | P0135R1 | ![]() |
![]() |
![]() |
New specification for inheriting constructors (DR1941 et al) | P0136R1 | ![]() |
![]() |
![]() |
Replacement of class objects containing reference members | P0137R1 | ![]() | ||
Direct-list-initialization of enumerations | P0138R2 | ![]() |
![]() |
![]() |
Stricter expression evaluation order | P0145R3 | ![]() |
![]() |
![]() |
constexpr lambda expressions | P0170R1 | ![]() |
![]() |
![]() |
Differing begin and end types in range-based for | P0184R0 | ![]() |
![]() |
![]() |
[[fallthrough]] attribute | P0188R1 | ![]() |
![]() |
![]() |
[[nodiscard]] attribute | P0189R1 | ![]() |
![]() |
![]() |
Pack expansions in using-declarations | P0195R2 | ![]() |
![]() |
![]() |
[[maybe_unused]] attribute | P0212R1 | ![]() |
![]() |
![]() |
Structured Bindings | P0217R3 | ![]() |
![]() |
![]() |
Hexadecimal floating-point literals | P0245R1 | ![]() |
![]() |
![]() |
Ignore unknown attributes | P0283R2 | ![]() |
![]() |
![]() |
constexpr if statements | P0292R2 | ![]() |
![]() |
![]() |
init-statements for if and switch | P0305R1 | ![]() |
![]() |
![]() |
Inline variables | P0386R2 | ![]() |
![]() |
![]() |
DR: Matching of template template-arguments excludes compatible templates | P0522R0 | ![]() |
![]() |
![]() |
std::uncaught_exceptions() | N4259 | ![]() |
![]() |
![]() |
Improving std::pair and std::tuple | N4387 | ![]() |
![]() |
![]() |
std::any | P0220R1 | ![]() |
![]() |
|
std::variant | P0088R3 | ![]() |
![]() |
![]() |
std::optional | P0220R1 | ![]() |
![]() |
|
std::shared_mutex (untimed) | N4508 | ![]() |
![]() |
![]() |
std::string_view | N3921 | ![]() |
![]() |
|
Standardization of Parallelism TS | P0024R2 | |||
Elementary string conversions | P0067R5 | |||
Mathematical special functions | P0226R1 | ![]() |
![]() |
|
Splicing Maps and Sets | P0083R3 | |||
Hardware interference size | P0154R1 | |||
std::filesystem | P0218R1 | ![]() |
![]() |
![]() |
std::byte | P0298R3 | ![]() |
![]() |
![]() |
C++14 Features
Feature | C++14 Proposal Document | BCC32C/X | BCC64 |
---|---|---|---|
Tweaked wording for contextual conversions | N3323 | ![]() |
![]() |
Binary literals | N3472 | ![]() |
![]() |
decltype(auto), Return type deduction for normal functions | N3638 | ![]() |
![]() |
Initialized/Generalized lambda captures (init-capture) | N3648 | ![]() |
![]() |
Generic (polymorphic) lambda expressions | N3649 | ![]() |
![]() |
Variable templates | N3651 | ![]() |
![]() |
Extended constexpr | N3652 | ![]() |
![]() |
Member initializers and aggregates (NSDMI) | N3653 | ![]() |
![]() |
Clarifying memory allocation (avoiding/fusing allocations) | N3664 | ![]() |
![]() |
[[deprecated]] attribute | N3760 | ![]() |
![]() |
Sized deallocation | N3768 | ![]() |
![]() |
Single quote as digit separator | N3781 | ![]() |
![]() |
std::result_of and SFINAE | N3462 | ![]() |
![]() |
constexpr for <complex> | N3302 | ![]() |
![]() |
constexpr for <chrono> | N3469 | ![]() |
![]() |
constexpr for <array> | N3470 | ![]() |
![]() |
constexpr for <initializer_list>, <utility> and <tuple> | N3471 | ![]() |
![]() |
Improved std::integral_constant | N3545 | ![]() |
![]() |
User-defined literals for <chrono> and <string> | N3642 | ![]() |
![]() |
Null forward iterators | N3644 | ![]() |
![]() |
std::quoted | N3654 | ![]() |
![]() |
Heterogeneous associative lookup | N3657 | ![]() |
![]() |
std::integer_sequence | N3658 | ![]() |
![]() |
std::shared_timed_mutex | N3659 | ![]() |
![]() |
std::exchange | N3668 | ![]() |
![]() |
fixing constexpr member functions without const | N3669 | ![]() |
![]() |
std::get<T>() | N3670 | ![]() |
![]() |
Dual-Range std::equal, std::is_permutation, std::mismatch | N3671 | ![]() |
![]() |
C++11 Features
Feature | C++11 Proposal Document |
BCC32C/X | BCC32 | BCC64 | ||
---|---|---|---|---|---|---|
Rvalue references | N2118 | ![]() |
![]() |
![]() | ||
Rvalue references for *this
|
N2439 | ![]() |
![]() | |||
Initialization of class objects by rvalues | N1610 | ![]() |
![]() | |||
Non-static data member initializers | N2756 | ![]() |
![]() | |||
Variadic templates | N2242 | ![]() |
![]() | |||
Extending variadic template template parameters | N2555 | ![]() |
![]() | |||
Initializer lists | N2672 | ![]() |
![]() | |||
Static assertions | N1720 | ![]() |
![]() |
![]() | ||
auto -typed variables
|
N1984 | ![]() |
![]() | |||
Multi-declarator auto
|
N1737 | ![]() |
![]() |
![]() | ||
Removal of auto as a storage-class specifier | N2546 | ![]() |
![]() | |||
New function declarator syntax | N2541 | ![]() |
![]() | |||
Lambda expressions | N2927 | ![]() |
![]() | |||
Declared type of an expression | N2343 | ![]() |
![]() |
![]() | ||
Incomplete return types | N3276 | ![]() |
![]() | |||
Right angle brackets | N1757 | ![]() |
![]() | |||
Default template arguments for function templates | DR226 | ![]() |
![]() | |||
Solving the SFINAE problem for expressions | DR339 | ![]() |
![]() | |||
Alias templates | N2258 | ![]() |
![]() | |||
Extern templates | N1987 | ![]() |
![]() |
![]() | ||
Null pointer constant | N2431 | ![]() |
![]() | |||
Strongly-typed enums | N2347 | ![]() |
![]() |
![]() | ||
Forward declarations for enums | N2764 DR1206 |
![]() |
![]() |
![]() | ||
Standardized attribute syntax | N2761 | |||||
Generalized constant expressions | N2235 | ![]() |
![]() | |||
Alignment support | N2341 | |||||
Conditionally-support behavior | N1627 | ![]() |
![]() | |||
Changing undefined behavior into diagnosable errors | N1727 | ![]() |
![]() | |||
Delegating constructors | N1986 | ![]() |
![]() | |||
Inheriting constructors | N2540 | |||||
Explicit conversion operators | N2437 | ![]() |
![]() |
![]() | ||
New character types | N2249 | ![]() |
![]() |
![]() | ||
Unicode string literals | N2442 | ![]() |
![]() | |||
Raw string literals | N2442 | ![]() |
![]() | |||
Universal character names in literals | N2170 | ![]() |
![]() | |||
User-defined literals | N2765 | ![]() |
![]() | |||
Standard Layout Types | N2342 | ![]() |
![]() | |||
Defaulted functions | N2346 | ![]() |
![]() | |||
Deleted functions | N2346 | ![]() |
![]() | |||
Extended friend declarations | N1791 | ![]() |
![]() | |||
Extending sizeof
|
N2253 DR850 |
![]() |
![]() | |||
Inline namespaces | N2535 | ![]() |
![]() | |||
Unrestricted unions | N2544 | ![]() |
![]() | |||
Local and unnamed types as template arguments | N2657 | ![]() |
![]() | |||
Range-based for | N2930 | ![]() |
![]() | |||
Explicit virtual overrides | N2928 N3206 N3272 |
![]() |
![]() | |||
Minimal support for garbage collection and reachability-based leak detection | N2670 | |||||
Allowing move constructors to throw [noexcept] | N3050 | ![]() |
![]() | |||
Defining move special member functions | N3053 | ![]() |
![]() | |||
Concurrency | ||||||
Sequence points | N2239 | |||||
Atomic operations | N2427 | ![]() |
![]() | |||
Strong Compare and Exchange | N2748 | ![]() |
![]() | |||
Bidirectional Fences | N2752 | ![]() |
![]() | |||
Memory model | N2429 | |||||
Data-dependency ordering: atomics and memory model | N2664 | |||||
Propagating exceptions | N2179 | ![]() |
![]() | |||
Allow atomics use in signal handlers | N2547 | ![]() |
![]() | |||
Thread-local storage | N2659 | |||||
Dynamic initialization and destruction with concurrency | N2660 | ![]() |
![]() | |||
C99 Features in C++11 | ||||||
__func__ predefined identifier
|
N2340 | ![]() |
![]() | |||
C99 preprocessor | N1653 | ![]() |
![]() | |||
long long type
|
N1811 | ![]() |
![]() |
![]() | ||
Extended integral types | N1988 | ![]() |
![]() |