C++ Support in Clang

Clang implements the following published and upcoming ISO C++ standards:

Language Standard Flag Available in Clang?
C++2c -std=c++2c Partial
C++23 -std=c++23 Partial
C++20 -std=c++20 Partial
C++17 -std=c++17 Clang 5
C++14 -std=c++14 Clang 3.4
C++11 -std=c++11 Clang 3.3
C++98 / C++03 -std=c++98 Yes (other than export)

The Clang community is continually striving to improve C++ standards compliance between releases by submitting and tracking C++ Defect Reports and implementing resolutions as they become available.

Experimental work is also under way to implement C++ Technical Specifications that will help drive the future of the C++ programming language.

The LLVM bug tracker uses the "c++" label, as well as mode-specific labels such as "c++11", "c++14", and so on, to track known bugs with Clang's language conformance.

C++2c implementation status

Clang has support for some of the features of the C++ standard following C++23, informally referred to as C++26.

You can use Clang in C++2c mode with the -std=c++2c option.

List of features and minimum Clang version with support
Language Feature C++26 Proposal Available in Clang?
Remove undefined behavior from lexing P2621R2 (DR) Clang 3.3
Making non-encodable string literals ill-formed P1854R4 (DR) Clang 14
Unevaluated strings P2361R6 Clang 18
Add @, $, and ` to the basic character set P2558R2 Yes
constexpr cast from void* P2738R1 Clang 17
On the ignorability of standard attributes P2552R3 (DR) No
Static storage for braced initializers P2752R3 (DR) No
User-generated static_assert messages P2741R3 Clang 17
Placeholder variables with no name P2169R4 Clang 18
Template parameter initialization P2308R1 (DR) Clang 18
Pack Indexing P2662R3 No
Remove Deprecated Arithmetic Conversion on Enumerations P2864R2 Clang 18

C++23 implementation status

Clang has support for some of the features of the ISO C++ 2023 standard.

You can use Clang in C++23 mode with the -std=c++23 option.

List of features and minimum Clang version with support
Language Feature C++23 Proposal Available in Clang?
Literal suffix uz, z for size_t, ssize_t P0330R8 Clang 13
Make () in lambdas optional in all cases P1102R2 Clang 13
Simpler implicit move P2266R1 Clang 13
if consteval P1938R3 Clang 14
Allow duplicate attributes P2156R1 Clang 13
Narrowing contextual conversions to bool P1401R5 Clang 14
Trimming whitespaces before line splicing P2223R2 Yes
Make declaration order layout mandated P1874R4 Yes
C++ identifier syntax using UAX 31 P1949R7 Clang 14
Mixed string literal concatenation P2201R1 Yes
Deducing this P0847R7 Clang 18
P2797R0 No
Change scope of lambda trailing-return-type P2036R3 Clang 17
P2579R0
Multidimensional subscript operator P2128R6 Clang 15
Non-literal variables (and labels and gotos) in constexpr functions P2242R3 Clang 15
Character encoding of diagnostic text P2246R1 Yes
Character sets and encodings P2314R4 Yes
Consistent character literal encoding P2316R2 Yes
Add support for preprocessing directives elifdef and elifndef P2334R1 Clang 13
Extend init-statement to allow alias-declaration P2360R0 Clang 14
auto(x): decay-copy in the language P0849R8 Clang 15
Attributes on Lambda-Expressions P2173R1 Clang 13
constexpr for <cmath> and <cstdlib> P0533R9 No
Type trait to determine if a reference binds to a temporary P2255R2
Partial Clang provides __reference_constructs_from_temporary type trait builtin, with which std::reference_constructs_from_temporary is implemented. __reference_converts_from_temporary needs to be provided, following the normal cross-vendor convention to implement traits requiring compiler support directly.
The Equality Operator You Are Looking For P2468R2 Clang 16
De-deprecating volatile compound operations P2327R1 Clang 15
Support for #warning P2437R1 Yes
Remove non-encodable wide character literals and multicharacter wide character literals P2362R3 Clang 14
Labels at the end of compound statements P2324R2 Clang 16
Delimited escape sequences P2290R3 Clang 15
Named universal character escapes P2071R2 Clang 15
Relaxing some constexpr restrictions P2448R2
Clang 17 (Partial) We do not support outside of defaulted special memeber functions the change that constexpr functions no longer have to be constexpr compatible but rather support a less restricted requirements for constexpr functions. Which include allowing non-literal types as return values and parameters, allow calling of non-constexpr functions and constructors.
Using unknown pointers and references in constant expressions P2280R4 (DR) No
static operator() P1169R4 Clang 16
Extended floating-point types and standard names P1467R9 No
Class template argument deduction from inherited constructors P2582R1 No
Portable assumptions P1774R8 No
Support for UTF-8 as a portable source file encoding P2295R6 Clang 15
char8_t Compatibility and Portability Fix P2513R3 Clang 16
Relax requirements on wchar_t to match existing practices P2460R2 Yes
Explicit lifetime management P2590R2 No
static operator[] P2589R1 Clang 16
Permitting static constexpr variables in constexpr functions P2647R1 Clang 16
consteval needs to propagate up P2564R3 (DR) Clang 17
Lifetime extension in range-based for loops P2718R0 No
Referencing The Unicode Standard P2736R2 Yes

C++20 implementation status

Clang has support for some of the features of the ISO C++ 2020 standard.

You can use Clang in C++20 mode with the -std=c++20 option (use -std=c++2a in Clang 9 and earlier).

List of features and minimum Clang version with support
Language Feature C++20 Proposal Available in Clang?
Default member initializers for bit-fields P0683R1 Clang 6
const&-qualified pointers to members P0704R1 Clang 6
Allow lambda-capture [=, this] P0409R2 Clang 6
__VA_OPT__ for preprocessor comma elision P0306R4 Clang 6
P1042R1 Clang 9
Designated initializers P0329R4 Clang 10
template-parameter-list for generic lambdas P0428R2 Clang 9
Concepts P0734R0 Clang 10
P0857R0 Clang 16
P1084R2 Clang 10
P1141R2
P0848R3
Clang 16 (Partial) Because of other concepts implementation deficits, the __cpp_concepts macro is not yet set to 202002L. Also, the related defect reports DR1496 and DR1734 are not yet implemented. Accordingly, deleted special member functions are treated as eligible even though they shouldn't be.
P1616R1 Clang 10
P1452R2
P1972R0 Clang 10
P1980R0
P2103R0
P2493R0
P2092R0 Clang 16
P2113R0 Clang 16
Range-based for statements with initializer P0614R1 Clang 8
ADL and function templates that are not visible P0846R0 Clang 9
const mismatch with defaulted copy constructor P0641R2 Clang 8
Consistent comparison (operator<=>) P0515R3 Clang 10
P0905R1
P1120R0
P1185R2
P1186R3
P1630R1
P1946R0
P1959R0
P2002R1 Clang 17
P2085R0 Clang 14
Access checking on specializations P0692R1 Clang 14
Default constructible and assignable stateless lambdas P0624R2 Clang 8
Lambdas in unevaluated contexts P0315R4 Clang 17
[[no_unique_address]] attribute P0840R2 Clang 9
[[likely]] and [[unlikely]] attributes P0479R5 Clang 12
typename optional in more contexts P0634R3 Clang 16
Pack expansion in lambda init-capture P0780R2 Clang 9
Class types as non-type template parameters P0732R2 Partial
P1907R1
Destroying operator delete P0722R3 Clang 6
Relaxations of constexpr restrictions P1064R0 Clang 9
P1002R1 Clang 8
P1327R1 Clang 9
P1330R0
P1331R2 Clang 10
P1668R1
P0784R7
Prohibit aggregates with user-declared constructors P1008R1 Clang 8
Feature test macros P0941R2 (see below)
explicit(bool) P0892R2 Clang 9
Signed integers are two's complement P1236R1 Clang 9
char8_t P0482R6 Clang 7 (11)
Immediate functions (consteval) P1073R3 Clang 17
P1937R2 Clang 14
std::is_constant_evaluated P0595R2 Clang 9
Nested inline namespaces P1094R2 Clang 8
Structured binding extensions P1091R3 Clang 16
P1381R1
Stronger Unicode requirements P1041R4 Yes
P1139R2
Parenthesized initialization of aggregates P0960R3 Clang 16
P1975R0
Modules P1103R3 Clang 15
P1766R1 (DR) Clang 11
P1811R0 No
P1703R1 Subsumed by P1857
P1874R1 Clang 15
P1979R0 No
P1779R3 Clang 15
P1857R3 No
P2115R0 Partial
P1815R2 Partial
P2615R1 (DR) No
P2788R0 (DR) No
Coroutines P0912R5
Partial Fully supported on all targets except Windows, which still has some stability and ABI issues.
Deprecate a[b,c] P1161R3 Clang 9
Deprecate some problematic uses of volatile P1152R4 Clang 10
[[nodiscard("with reason")]] P1301R4 Clang 9
using enum P1099R5 Clang 13
Class template argument deduction for aggregates P1816R0 Clang 17
P2082R1
Class template argument deduction for alias templates P1814R0 No
Permit conversions to arrays of unknown bound P0388R4 Clang 14
constinit P1143R2 Clang 10
Pseudo-destructors end object lifetimes P0593R6 (DR) Clang 11
More implicit moves P1825R0 (DR) Clang 13

(11): Prior to Clang 8, this feature is not enabled by -std=c++20, but can be enabled with -fchar8_t.

C++17 implementation status

Clang 5 and later implement all the features of the ISO C++ 2017 standard.

By default, Clang 16 or later builds C++ code according to the C++17 standard. You can use Clang in C++17 mode with the -std=c++17 option (use -std=c++1z in Clang 4 and earlier).

List of features and minimum Clang version with support
Language Feature C++17 Proposal Available in Clang?
static_assert with no message N3928 Clang 3.5
Disabling trigraph expansion by default N4086 Clang 3.5
typename in a template template parameter N4051 Clang 3.5
New auto rules for direct-list-initialization N3922 Clang 3.8 (8)
Fold expressions N4295 Clang 3.6
P0036R0 Clang 3.9
u8 character literals N4267 Clang 3.6
Nested namespace definition N4230 Clang 3.6
Attributes for namespaces and enumerators N4266 Clang 3.6
Allow constant evaluation for all non-type template arguments N4268 Clang 3.6
Remove deprecated register storage class P0001R1 Clang 3.8
Remove deprecated bool increment P0002R1 Clang 3.8
Make exception specifications part of the type system P0012R1 Clang 4
__has_include in preprocessor conditionals P0061R1 Yes
[[fallthrough]] attribute P0188R1 Clang 3.9
[[nodiscard]] attribute P0189R1 Clang 3.9
P1771R1 (DR) Clang 9
[[maybe_unused]] attribute P0212R1 Clang 3.9
Aggregate initialization of classes with base classes P0017R1 Clang 3.9
constexpr lambda expressions P0170R1 Clang 5
Differing begin and end types in range-based for P0184R0 Clang 3.9
Lambda capture of *this P0018R3 Clang 3.9
Direct-list-initialization of enums P0138R2 Clang 3.9
Hexadecimal floating-point literals P0245R1 Yes
Using attribute namespaces without repetition P0028R4 Clang 3.9
Dynamic memory allocation for over-aligned data P0035R4 Clang 4
Template argument deduction for class templates P0091R3 Clang 5
P0512R0
P0620R0 (DR) Clang 7
P0702R1 (DR) Clang 6
Non-type template parameters with auto type P0127R2 Clang 4
Guaranteed copy elision P0135R1 Clang 4
Stricter expression evaluation order P0145R3 Clang 4 (9)
P0400R0
Requirement to ignore unknown attributes P0283R2 Yes
constexpr if-statements P0292R2 Clang 3.9
Inline variables P0386R2 Clang 3.9
Structured bindings P0217R3 Clang 4
P0961R1 (DR) Clang 8
P0969R0 (DR) Clang 8
Separate variable and condition for if and switch P0305R1 Clang 3.9
Matching template template parameters to compatible arguments P0522R0 Partial (10)
Removing deprecated dynamic exception specifications P0003R5 Clang 4
Pack expansions in using-declarations P0195R2 Clang 4

(8): This is a backwards-incompatible change that is applied to all language versions that allow type deduction from auto (per the request of the C++ committee). In Clang 3.7, a warning is emitted for all cases that would change meaning.
(9): Under the MS ABI, function parameters are destroyed from left to right in the callee. As a result, function parameters in calls to operator<<, operator>>, operator->*, operator&&, operator||, and operator, functions using expression syntax are no longer guaranteed to be destroyed in reverse construction order in that ABI. This is not fully supported during constant expression evaluation until Clang 12.
(10): Despite being the resolution to a Defect Report, this feature is disabled by default in all language versions, and can be enabled explicitly with the flag -frelaxed-template-template-args in Clang 4 onwards. The change to the standard lacks a corresponding change for template partial ordering, resulting in ambiguity errors for reasonable and previously-valid code. This issue is expected to be rectified soon.

C++14 implementation status

Clang 3.4 and later implement all of the ISO C++ 2014 standard.

You can use Clang in C++14 mode with the -std=c++14 option (use -std=c++1y in Clang 3.4 and earlier).

List of features and minimum Clang version with support
Language Feature C++14 Proposal Available in Clang?
Tweak to certain C++ contextual conversions N3323 Clang 3.4
Binary literals N3472 Clang 2.9
decltype(auto) N3638 Clang 3.3
Return type deduction for normal functions Clang 3.4
Initialized lambda captures N3648 Clang 3.4
Generic lambdas N3649 Clang 3.4
Variable templates N3651 Clang 3.4
Relaxing requirements on constexpr functions N3652 Clang 3.4
Member initializers and aggregates N3653 Clang 3.3
Clarifying memory allocation N3664 Clang 3.4
[[deprecated]] attribute N3760 Clang 3.4
Single quotation mark as digit separator N3781 Clang 3.4
C++ Sized Deallocation N3778 Clang 3.4 (7)

(7): In Clang 3.7 and later, sized deallocation is only enabled if the user passes the -fsized-deallocation flag. The user must supply definitions of the sized deallocation functions, either by providing them explicitly or by using a C++ standard library that does. libstdc++ added these functions in version 5.0, and libc++ added them in version 3.7.

C++11 implementation status

Clang 3.3 and later implement all of the ISO C++ 2011 standard.

You can use Clang in C++11 mode with the -std=c++11 option. Clang's C++11 mode can be used with libc++ or with gcc's libstdc++.

List of features and minimum Clang version with support
Language Feature C++11 Proposal Available in Clang?
Rvalue references N2118 Clang 2.9
P1825R0 (DR) Clang 13
    Rvalue references for *this N2439 Clang 2.9
Initialization of class objects by rvalues N1610 Clang 2.9
Non-static data member initializers N2756 Clang 3.0
Variadic templates N2242 Clang 2.9
    Extending variadic template template parameters N2555 Clang 2.9
Initializer lists N2672 Clang 3.1
P1009R2 (DR) Clang 9
P1957R2 (DR) Clang 11
Static assertions N1720 Clang 2.9
auto-typed variables N1984 Clang 2.9
    Multi-declarator auto N1737 Clang 2.9
    Removal of auto as a storage-class specifier N2546 Clang 2.9
    New function declarator syntax N2541 Clang 2.9
Lambda expressions N2927 Clang 3.1
P0588R1 (DR) No
Declared type of an expression N2343 Clang 2.9
    Incomplete return types N3276 Clang 3.1
Right angle brackets N1757 Clang 2.9
Default template arguments for function templates DR226 Clang 2.9
Solving the SFINAE problem for expressions DR339 Clang 2.9
Alias templates N2258 Clang 3.0
Extern templates N1987 Clang 2.9
Null pointer constant N2431 Clang 3.0
Strongly-typed enums N2347 Clang 2.9
Forward declarations for enums N2764
DR1206
Clang 3.1
Standardized attribute syntax N2761 Clang 3.3 (1)
Generalized constant expressions N2235 Clang 3.1
P0859R0 (DR) Clang 8
Alignment support N2341 Clang 3.3
Conditionally-support behavior N1627 Clang 2.9
Changing undefined behavior into diagnosable errors N1727 Clang 2.9
Delegating constructors N1986 Clang 3.0
Inheriting constructors N2540 Clang 3.3
P0136R1 (DR) Clang 3.9
Explicit conversion operators N2437 Clang 3.0
New character types N2249 Clang 2.9
Unicode string literals N2442 Clang 3.0
Raw string literals N2442 Clang 3.0
Universal character names in literals N2170 Clang 3.1
User-defined literals N2765 Clang 3.1
Standard Layout Types N2342 Clang 3.0
Defaulted functions N2346 Clang 3.0
P1286R2 (DR) Clang 9
Deleted functions N2346 Clang 2.9
Extended friend declarations N1791 Clang 2.9
Extending sizeof N2253
DR850
Clang 3.1
Inline namespaces N2535 Clang 2.9
Unrestricted unions N2544 Clang 3.1
Local and unnamed types as template arguments N2657 Clang 2.9
Range-based for N2930 Clang 3.0
P0962R1 (DR) Clang 8
Explicit virtual overrides N2928
N3206
N3272
Clang 3.0
Minimal support for garbage collection and reachability-based leak detection N2670 N/A (2)
Allowing move constructors to throw [noexcept] N3050 Clang 3.0
Defining move special member functions N3053 Clang 3.0
Concurrency
Sequence points N2239 Clang 3.3
Atomic operations N2427 Clang 3.1
Strong Compare and Exchange N2748 Clang 3.1 (3)
Bidirectional Fences N2752 Clang 3.1
Memory model N2429 Clang 3.2
Data-dependency ordering: atomics and memory model N2664 Clang 3.2 (4)
Propagating exceptions N2179 Clang 2.9
Allow atomics use in signal handlers N2547 Clang 3.1
Thread-local storage N2659 Clang 3.3 (5)
Dynamic initialization and destruction with concurrency N2660 Clang 2.9
C99 Features in C++11
__func__ predefined identifier N2340 Clang 2.9
C99 preprocessor N1653 Clang 2.9
long long N1811 Clang 2.9
Extended integral types N1988 N/A (6)

(1): The [[carries_dependency]] attribute has no effect.
(2): No compiler changes are required for an implementation such as Clang that does not provide garbage collection.
(3): All compare-exchange operations are emitted as strong compare-exchanges.
(4): memory_order_consume is lowered to memory_order_acquire.
(5): thread_local support requires a C++ runtime library providing __cxa_thread_atexit, such as libc++abi 3.6 or later, or libsupc++ 4.8 or later.
(6): No compiler changes are required for an implementation such as Clang that does not provide any extended integer types. __int128 is not treated as an extended integer type, because changing intmax_t would be an ABI-incompatible change.

C++98 implementation status

Clang implements all of the ISO C++ 1998 standard (including the defects addressed in the ISO C++ 2003 standard) except for export (which was removed in C++11).

Defect reports

Clang generally aims to implement resolutions to Defect Reports (bug fixes against prior standards) retroactively, in all prior standard versions where the fix is meaningful. Significant Defect Report changes to language features after the publication of the relevant standard are marked (DR) in the above table.

Clang also has a test suite for conformance to resolutions for issues on the C++ core issues list, most of which are considered Defect Reports. Implementation status for C++ core issues based on that test suite is tracked on a separate page.

Technical specifications and standing documents

ISO C++ also publishes a number of documents describing additional language and library features that are not part of standard C++.

List of features and minimum Clang version with support
Document Latest draft Compiler flag Available in Clang?
SD-6: SG10 feature test recommendations SD-6 N/A Clang 3.4 (N3745)
Clang 3.6 (N4200)
Clang 4 (P0096R3)
Clang 5 (P0096R4)
Clang 7 (P0096R5)
Clang 9 (P1353R0)
Clang 10 (P1902R1)
[TS] Concepts P0121R0 Superseded by P0734R0
[TS] Coroutines N4663 -fcoroutines-ts
-stdlib=libc++
Clang 5
-std=c++20
-stdlib=libc++
Superseded by P0912R5
[TS] Library Fundamentals, Version 1 (invocation type traits) N4480 N/A No
[TS] Library Fundamentals, Version 2 (source_location) N4617 N/A Clang 9 (documentation)
[TS] Modules N4720 -fmodules-ts Superseded by P1103R3
[DRAFT TS] Reflection N4818 No
[TS] Transactional Memory N4514 No