C++11 conformance
- GCC 4.81 - 100%
- Clang 3.3 - 100%
- Intel 14.0 - 84%
- Visual C++ 2013 - 66%
Another year is almost over so it is a good time to check what is going on with C++. This time more stats and real data compared to my post from the previous year.
PlanChart
This chart provides a general view on C++11 conformance. Percentage comes from counting implemented features in a given compiler according to the list of 45 C++11 language features. Please note that the view may be a bit imperfect or unfair. One language feature can have more "value"/importance than some other. For instance "extern template" vs "constxpr". Or "long long" vs "delegating constructors". This would require to put partial factors for each feature. Additionally some features have several versions (like move or lambda) - only the latest version should be counted.
Compiler | Conformance |
GCC 4.6 | 73% |
GCC 4.7 | 87% |
GCC 4.81 | 100% |
Clang 2.9 | 44% |
Clang 3.0 | 76% |
Clang 3.1 | 93% |
Clang 3.2 | 93% |
Clang 3.3 | 100% |
Intel C++ 12 | 36% |
Intel C++ 13 | 53% |
Intel C++ 14 | 82% |
MCVC 10.0 | 27% |
MCVC 11.0 | 42% |
MCVC 12.0 | 64% |
MCVC 12.1 (NOV CTP) | 80% |
Data
I used wiki.apache.org/stdcxx as a base for my work. I've upgraded it and cleaned up a bit. Additionally compilers: HP, EDGE, IBM, Sun/Oracle, C++ Builder (front-end is based on Clang 3.1 now) and Digital Mars were removed.
C++11 language feature | Proposal | GCC | Intel C++ | MSVC | Clang |
Alignment | N2341 | 4,8 | 12,1 | 3,0 | |
Atomic operations | N2427 | 4,4 | 13,0 | 11,0 | 3,1 |
auto v1.0 | N2546 | 4,4 | 12,0 | 10,0 | 2,9 |
C99 preprocessor | N1653 | 4,3 | 11,1 | 2,9 | |
constexpr | N2235 | 4,6 | 14,0 | 12,1 | 3,1 |
decltype v1.0 | N2343 | 4,3 | 12,0 | 10,0 | 2,9 |
decltype v1.1 | N3276 | 4,8 | 12,0 | 12,0 | 2,9 |
Defaulted And Deleted Functions | N2346 | 4,4 | 12,0 | 12,0 | 3,0 |
Delegating Constructors | N1986 | 4,7 | 14,0 | 12,0 | 3,0 |
Explicit conversion operators | N2437 | 4,5 | 13,0 | 12,0 | 3,0 |
Extended friend Declarations | N1791 | 4,7 | 11,0 | 10,0 | 2,9 |
extern template | N1987 | 3,3 | 9,0 | 6,0 | 2,9 |
Forward declarations for enums | N2764 | 4,6 | 14,0 | 11,0 | 3,1 |
Inheriting Constructors | N2540 | 4,8 | 12,1 | 3,3 | |
Initializer Lists | N2672 | 4,4 | 13,0 | 12,0 | 3,1 |
Lambda v1.0 | N2658 | 4,5 | 12,0 | 10,0 | 3,1 |
Lambda v1.1 | N2927 | 4,5 | 12,0 | 11,0 | 3,1 |
Local and Unnamed Types as Template Arguments | N2657 | 4,5 | 12,0 | 8,0 | 2,9 |
long long | N1811 | 4,3 | 11,0 | 7,1 | 2,9 |
Namespace Association | N2535 | 4,4 | 14,0 | 2,9 | |
New character types | N2249 | 4,4 | 14,0 | 2,9 | |
New function declaration syntax for deduced return types | N2541 | 4,4 | 12,0 | 10,0 | 2,9 |
nullptr | N2431 | 4,6 | 12,1 | 10,0 | 2,9 |
Unicode String Literals | N2442 | 4,4 | 11,0 | 3,0 | |
Raw String Literals | N2442 | 4,5 | 14,0 | 12,0 | 3,0 |
User-defined Literals | N2765 | 4,7 | 3,1 | ||
Right Angle Brackets | N1757 | 4,3 | 11,0 | 8,0 | 2,9 |
R-Value References, std::move v2.1 | N2884+ | 4,5 | 14,0 | 11,0 | 3,0 |
R-Value References, std::move v3.0 | N3053 | 4,5 | 14,0 | 3,0 | |
static_assert | N1720 | 4,3 | 11,0 | 10,0 | 2,9 |
Strongly-typed enums | N2347 | 4,4 | 14,0 | 11,0 | 2,9 |
Template aliases | N2258 | 4,7 | 12,1 | 12,0 | 3,0 |
Thread-Local Storage | N2659 | 4,8 | 3,3 | ||
Unrestricted Unions | N2544 | 4,6 | 3,0 | ||
Built-in Type Traits | N1836 | 4,3 | 10,0 | 8,0 | 3,0 |
Variadic Templates v0.9 | N2242 | 4,3 | 12,1 | 12,0 | 2,9 |
Variadic Templates v1.0 | N2555 | 4,4 | 12,0 | 2,9 | |
Range-based for-loop | N2930 | 4,6 | 13,0 | 11,0 | 3,0 |
override and final v1.0 | N3272 | 4,7 | 14,0 | 11,0 | 2,9 |
Attributes | N2761 | 4,8 | 12,1 | 3,3 | |
ref-qualifiers | N2439 | 4,81 | 14,0 | 12,1 | 2,9 |
Non-static data member initializers | N2756 | 4,7 | 14,0 | 12,0 | 3,0 |
Extended sizeof | N2253 | 4,4 | 12,1 | 3,1 | |
Allowing move constructors to throw [noexcept] | N3050 | 4,6 | 14,0 | 12,1 | 3,0 |
Dynamic initialization and destruction with concurrency (Magic statics) | N2660 | 4,3 | 12,1 | 2,9 |
Remarks
- Version 12.1 of MSVC means - November CTP, but this is not "official" of course.
- long long support for VS: probably from the version 7.1, but before that it existed as a __int64
Changes
- 05 Jan 2014
- Added "noexcept" and "extended sizeof" feature,
- Included more features implemented in VS Nov CTP.
- Removed "auto v0.9", r-value 1.0 and 2.0,
- minor changes, layout, colors
- 31 Dec 2013 - initial version
Resources
- C++11 compiler support - apache
- Visual Studio 2013 C++ November CTP and more precise feature list
- GCC C++11 Status
- CLang Cxx Status
BTW: C++14 draft specification is already implemented by Clang 3.4. I did not included any of C++14 features here. I will come back to this topic later.