Modern C++ Language Features Compliance Status

From RAD Studio

Go Up to Modern C++


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

See Also