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. ".
Notes.
References
Additional literature:
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.
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 ** |
- 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
- CLang C ++ 11/14/17
- GCC: C ++ 11 table, C ++ 14 table , list of enhancements that will be added to GCC 5
- Relevant for 2012 list of links from Scott Meyers
- MSVS 2013 C ++ 11 , C ++ 14
- Intel C ++ 11
- 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:
- 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)
- 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.