C++ Support in Clang
Last updated: $Date: 2015-03-19 19:31:07 -0500 (Thu, 19 Mar 2015) $
Clang fully implements all published ISO C++ standards including C++11, as well as the upcoming C++14 standard, and some parts of the fledgling C++1z standard, and is considered a production-quality C++ compiler.
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 contains Clang C++ components that track known bugs with Clang's language conformance in each language mode.
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).
C++11 implementation status
Clang 3.3 and later implement all of the ISO C++ 2011 standard. The following table describes the Clang version in which each feature became available.
By default, Clang builds C++ code according to the C++98 standard, with many
C++11 features accepted as extensions. 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++, but
patches are needed to make libstdc++-4.4
work with Clang in C++11 mode. Patches are also needed to make
and libstdc++-4.7 work with Clang
releases prior to version 3.2 in C++11 mode. thread_local support
currently requires the C++ runtime library from g++-4.8 or later.
|Language Feature||C++11 Proposal||Available in Clang?|
|Rvalue references||N2118||Clang 2.9|
| Rvalue references for
|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|
|Static assertions||N1720||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|
|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
|Standardized attribute syntax||N2761||Clang 3.3 (1)|
|Generalized constant expressions||N2235||Clang 3.1|
|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|
|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|
|Deleted functions||N2346||Clang 2.9|
|Extended friend declarations||N1791||Clang 2.9|
|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|
|Explicit virtual overrides||N2928
|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|
|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|
|Dynamic initialization and destruction with concurrency||N2660||Clang 2.9|
|C99 Features in C++11|
|C99 preprocessor||N1653||Clang 2.9|
|Extended integral types||N1988||N/A (5)|
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.
memory_order_consume is lowered to
(5): 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,
intmax_t would be an ABI-incompatible
C++14 implementation status
Clang 3.4 and later implement all of the Draft International Standard (see most recent publicly available draft) of the upcoming C++14 language standard. The following table describes the Clang version in which each feature became available.
You can use Clang in C++14 mode with the
-std=c++1y in Clang 3.4 and earlier).
|Language Feature||C++14 Proposal||Available in Clang?|
|Tweak to certain C++ contextual conversions||N3323||Clang 3.4|
|Binary literals||N3472||Clang 2.9|
|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 (6)|
(6): 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.
added these functions in version 5.0, and
libc++ added them in
C++1z implementation status
Clang has highly experimental support for some proposed features of the C++ standard following C++14, provisionally named C++1z. The following table describes which C++1z features have been implemented in Clang and in which Clang version they became available.
Note that support for these features may change or be removed without notice, as the draft C++1z standard evolves.
You can use Clang in C++1z mode with the
|Language Feature||C++1z 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||No|
|Fold expressions||N4295||Clang 3.6|
|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|
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++. The following table describes which language features have been implemented in Clang and in which Clang version they became available:
|Document||Latest draft||Available in Clang?|
|SD-6: SG10 feature test recommendations||SD-6||Clang 3.4 (N3745)|
|Clang 3.6 (N4200)|
|[DRAFT TS] Array extensions (arrays of runtime bound)||N3820||No|
|[DRAFT TS] Library fundamentals (invocation type traits)||N3908||No|
|[DRAFT TS] Concepts||N3929||No|