C++ Support in Clang
Last updated: $Date$
Clang fully implements all published ISO C++ standards (C++98 / C++03, C++11, and C++14), and most of the upcoming C++17 standard.
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.
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
 
(1): 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 
    
       
        Rvalue references for  
      *thisN2439 
      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) 
        SVN 
      
       
    Static assertions 
      N1720 
      Clang 2.9 
    
       
    auto-typed variablesN1984 
      Clang 2.9 
    
       
        Multi-declarator  
      autoN1737 
      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
       
      
DR1206Clang 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) 
        SVN 
      
       
    Deleted functions 
      N2346 
      Clang 2.9 
    
       
    Extended friend declarations 
      N1791 
      Clang 2.9 
    
       
    Extending  
      sizeofN2253
       
      
DR850Clang 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
      
N3272Clang 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 identifierN2340 
      Clang 2.9 
    
       
    C99 preprocessor 
      N1653 
      Clang 2.9 
    
       
    long longN1811 
      Clang 2.9 
    
       
Extended integral types 
      N1988 
      N/A (6) 
    [[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++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++17 implementation status
Clang 5 and later implement all the features of the ISO C++ 2017 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 | 
| [[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.
(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++2a implementation status
Clang has experimental support for some proposed features of the C++ standard following C++17, provisionally named C++2a. Note that support for these features may change or be removed without notice, as the draft C++2a standard evolves.
You can use Clang in C++2a mode with the -std=c++2a option.
List of features and minimum Clang version with support
| Language Feature | C++2a 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 | SVN | |
| Designated initializers | P0329R4 | Partial (extension) | 
| template-parameter-list for generic lambdas | P0428R2 | SVN | 
| Concepts | P0734R0 | No | 
| P0857R0 | ||
| P1084R2 | ||
| P1414R2 | ||
| Range-based for statements with initializer | P0614R1 | Clang 8 | 
| ADL and function templates that are not visible | P0846R0 | SVN | 
| const mismatch with defaulted copy constructor | P0641R2 | Clang 8 | 
| Consistent comparison (operator<=>) | P0515R3 | Partial | 
| P0905R1 | ||
| P1120R0 | ||
| P1185R2 | No | |
| Access checking on specializations | P0692R1 | Partial | 
| Default constructible and assignable stateless lambdas | P0624R2 | Clang 8 | 
| Lambdas in unevaluated contexts | P0315R4 | No | 
| [[no_unique_address]] attribute | P0840R2 | SVN | 
| [[likely]] and [[unlikely]] attributes | P0479R5 | No | 
| typename optional in more contexts | P0634R3 | No | 
| Pack expansion in lambda init-capture | P0780R2 | SVN | 
| Class types as non-type template parameters | P0732R2 | No | 
| Destroying operator delete | P0722R3 | Clang 6 | 
| Relaxations of constexpr restrictions | P1064R0 | SVN | 
| P1002R1 | Clang 8 | |
| P1327R1 | SVN | |
| P1330R0 | ||
| Prohibit aggregates with user-declared constructors | P1008R1 | Clang 8 | 
| Contracts | P0542R5 | No | 
| P1289R1 | ||
| P1323R2 | ||
| Feature test macros | P0941R2 | (see below) | 
| explicit(bool) | P0892R2 | SVN | 
| Signed integers are two's complement | P1236R1 | SVN | 
| char8_t | P0482R6 | Clang 7 (11) | 
| Immediate functions (consteval) | P1073R3 | No | 
| std::is_constant_evaluated | P0595R2 | SVN | 
| Nested inline namespaces | P1094R2 | Clang 8 | 
| Structured binding extensions | P1091R3 | Partial | 
| P1381R1 | ||
| Stronger Unicode requirements | P1041R4 | Yes | 
| P1139R2 | ||
| Parenthesized initialization of aggregates | P0960R3 | No | 
| Modules | P1103R3 | Partial | 
| Coroutines | P0912R5 | Partial | 
(11): Prior to Clang 8, this feature is not enabled by -std=c++2a, but can be enabled with -fchar8_t.
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) | |||
| WIP (P1353R0) | |||
| [TS] Concepts | P0121R0 | Superseded by P0734R0 | |
| [TS] Coroutines | N4663 | -fcoroutines-ts -stdlib=libc++ | Clang 5 | 
| -std=c++2a -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 | No | 
| [TS] Modules | N4720 | -fmodules-ts | Superseded by P1103R3 | 
| [DRAFT TS] Reflection | N4746 | No | |
| [TS] Transactional Memory | N4514 | No |