C ++ Support Summary Table 11/14/17

    As any C ++ developer who follows the latest in the industry and standards in particular, I was wondering how fully fully supported the standard C ++ 11 (as well as 1y and 1z) by different compilers? Yes, there are different pivot tables, but most often it is a comparison of two compilers or two versions of the same compiler, or a pivot table, but already outdated, or even an incomplete list. In general, I sat down and made a complete table (based on the Clang-a list and GCC) for four compilers: Clang, GNU C ++, MSVC and Intel C ++.
    Attention! This table is primarily intended for those who write their product. If you are developing a library, then, of course, it is better to familiarize yourself with the features of support in the primary source (or even better, write for all tests). For me, it is primarily a need for decisions like “Oh! Range-for can already be used without a problem. ".
    Part of the standard C ++ 11 Proposal Clang Gcc Vc Intel C ++
    C ++ 11
    Rvalue references N2118 2.9 4.3 10.0 - 13.0 12.0
        Rvalue references for * this N2439 2.9 4.8.1 13.0 14.0
    Initialization of class objects by rvalues N1610 2.9 4.0  11.1
    Non-static data member initializers N2756 3.0 4.7 12.0 -? 14.0
    Variadic templates N2242 2.9 4.3 11.1 12.0
        Extending variadic template template parameters N2555 2.9 4.4 12.0 12.0
    Initializer lists N2672 3.1 4.4 11.1 -? 13.0
    Static assertions N1720 2.9 4.3 10.0 11.0
    auto-typed variables N1984 2.9 4.4 10.0 11.0
        Multi-declarator auto N1737 2.9 4.4 10.0 12.0
        Removal of auto as a storage-class specifier N2546 2.9 4.4 10.0 11.0
        New function declarator syntax N2541 2.9 4.4 10.0 12.1
    Lambda expressions N2927 3.1 4.5 10.0 - 11.0 12.0
    Declared type of an expression N2343 2.9 4.3 10.0 - 11.0 11.0
        Incomplete return types N3276 3.1 4.8.1 12.0 12.0
    Right angle brackets N1757 2.9 4.3 10.0 11.0
    Default template arguments for function templates DR226 2.9 4.3 12.0 12.6
    Solving the SFINAE problem for expressions DR339 2.9 4.4  12.6
    Alias ​​templates N2258 3.0 4.7 12.0 12.6
    Extern templates N1987 2.9 4.0 10.0 9.0
    Null pointer constant N2431 3.0 4.6 10.0 12.1 *
    Strongly-typed enums N2347 2.9 4.4 10.0 - 11.0 12.0
    Forward declarations for enums N2764 DR1206 3.1 4.6 11.0 14.0
    Standardized attribute syntax N2761 3.3 * 4.8   12.1
    Generalized constant expressions N2235 3.1 4.6 13.0 -? 13.0
    Alignment support N2341 3.3 4.8 10.0 - 13.0 15.0
    Conditionally-support behavior N1627 2.9    
    Changing undefined behavior into diagnosable errors N1727 2.9    
    Delegating constructors N1986 3.0 4.7 12.0 14.0
    Inheriting constructors N2540 3.3 4.8 13.0 15.0
    Explicit conversion operators N2437 3.0 4.5 11.1 13.0
    New character types N2249 2.9 4.4 13.0 14.0
    Unicode string literals N2442 3.0 4.5 13.0 11.0 *
    Raw string literals N2442 3.0 4.5 11.1 14.0
    Universal character names in literals N2170 3.1 4.5  12.6
    User-defined literals N2765 3.1 4.7 13.0 15.0
    Standard Layout Types N2342 3.0 4.4 11.0 14.0
    Defaulted functions N2346 3.0 4.4 12.0 12.0
    Deleted functions N2346 2.9 4.4 12.0 12.0
    Extended friend declarations N1791 2.9 4.7 10.0 11.0
    Extending sizeof N2253 DR850 3.1 4.4 13.0 14.0
    Inline namespaces N2535 2.9 4.4 13.0 14.0
    Unrestricted unions N2544 3.1 4.6 13.0 14.0 *
    Local and unnamed types as template arguments N2657 2.9 4.5 10.0 12.0
    Range-based for N2930 3.0 4.6 11.0 13.0
    Explicit virtual overrides N2928 N3206 N3272 3.0 4.7 10.0 - 11.0 12.0 *
    Minimal support for garbage collection
    and reachability-based leak detection
    N2670 N / a N / a 10.0 15.0 *
    Allowing move constructors to throw [noexcept] N3050 3.0 4.6 13.0 14.0
    Defining move special member functions N3053 3.0 4.6  14.0
    C ++ 11 - Concurrency
    Sequence points N2239 3.3 4.0 N / a 15.0
    Atomic operations N2427 3.1 4.4 11.0 13.0
    Strong Compare and Exchange N2748 3.1 * 4.5 11.0 13.0
    Bidirectional fences N2752 3.1 4.8 11.0 13.0
    Memory model N2429 3.2 4.8 N / a 15.0 *
    Data-dependency ordering: atomics and memory model N2664 3.2 * 4.4 11.0 -? 15.0
    Propagating exceptions N2179 2.9 4.4 10.0 12.0
    Abandoning a process and at_quick_exit N2440  4.8 13.0 15.0 *
    Allow atomics use in signal handlers N2547 3.1 4.0  15.0 *
    Thread-local storage N2659 3.3 4.8 10.0 - 13.0 15.0 *
    Dynamic initialization and destruction with concurrency N2660 2.9 4.3 13.0 11.0 *
    C99 Features in C ++ 11
    __func__ predefined identifier N2340 2.9 4.3 10.0 - 13.0 11.0
    C99 preprocessor N1653 2.9 4.3 10.0 -? 11.1
    long long N1811 2.9 4.3 10.0 9.0
    Extended integral types N1988 N / a 4.0 N / a 15.0 *
         
    C ++ 14
    Tweak to certain C ++ contextual conversions N3323 3.4 4.9 12.0  
    Binary literals N3472 2.9 4.9 13.0 11.0
    decltype (auto) N3638 3.3 4.8 13.0 15.0
    Return type deduction for normal functions 3.4 4.9 13.0  
    Initialized lambda captures N3648 3.4 4.9 13.0 15.0
    Generic lambdas N3649 3.4 4.9 13.0  
    Variable templates N3651 3.4 5.0   
    Relaxing requirements on constexpr functions N3652 3.4 5.0   
    Member initializers and aggregates N3653 3.3 5.0   
    Clarifying memory allocation N3664 3.4 N / a   
    [[deprecated]] attribute N3760 3.4 4.9  15.0 *
    Single quotation mark as digit separator N3781 3.4 4.9 13.0  
    C ++ Sized Deallocation N3778 3.4 No 13.0  
          
    C ++ 1z
    static_assert with no message N3928 3.5    
    Disabling trigraph expansion by default N4086 3.5   13.0  
    typename in a template template parameter N4051 3.5 5.0  
    New auto rules for direct-list-initialization N3922 No    
    Fold expressions N4295 Svn    
    u8 character literals N4267 Svn    
    Nested namespace definition N4230 Svn    
    Attributes for namespaces and enumerators N4266 Svn    
    Allow constant evaluation for all non-type template arguments N4268 Svn    
          
    Drafts
    SD-6: SG10 feature test recommendations SD-6 3.4 5.0  
    Svn    
    [DRAFT TS] Array extensions (arrays of runtime bound) N3820 No 4.9   
    [DRAFT TS] Library fundamentals (invocation type traits) N3908 No    
    [DRAFT TS] Concepts N3929 No Yes **   
    Notes.
    • There may be inaccuracies in the table, for it was composed, for the most part, manually;
    • Support for the capabilities of the standard library is not indicated (I will add it upon urgent request);
    • * means that there are nuances (although full support). For example, the command line option - read the source;
    • No - the SOFTWARE feature is not supported;
    • N / A - the ability to support is impossible or simply not planned at all;
    • For MSVC, the range is indicated when there are two versions with Partial support and Full support. If Full support has not yet been announced, the second value after the range is a question mark;
    • ** GCC Concepts Lite branch.

    References
    1. CLang C ++ 11/14/17
    2. GCC: C ++ 11 table, C ++ 14 table , list of enhancements that will be added to GCC 5
    3. Relevant for 2012 list of links from Scott Meyers
    4. MSVS 2013 C ++ 11 , C ++ 14
    5. Intel C ++ 11
    6. Late found - Table (the identical English version ) with support for many different compilers, only the list is incomplete (40 of the 80 presented here).

    Additional literature:
    1. Effective Modern C ++: 42 Specific Ways to Improve Your Use of C ++ 11 and C ++ 14 (link to the publisher). Scott Meyers - Effective Modern C ++ (C ++ 11/14)
    2. A tour of C ++ - Bjarne Stroustrup


    PS And yes, of course, it is not worth making any conclusions about the superiority of one compiler over another. Each of the presented in the table has its own killer features and applications. However, it is unlikely that for a serious project the compiler will be considered only by the number of “syntax buns” (exaggerating). Be reasonable!

    UPD : Judging by the results of the survey (predictably), most people think that STL information is needed. Having studied this question a little, I realized that it would take not an hour or two to draw up a similar comparison. So I will do it if my hands reach, and in that case, just change the title to ("... and STL"). Whoever has the topic in the bookmarks will know that the information has been updated.

    Also popular now: