Как любому C++ разработчику, следящему за новинками в отрасли и стандартами в частности, мне стало интересно, насколько полно вообще поддерживается стандарт C++ 11 (а также 1y и 1z) разными компиляторами? Да, существуют разные сводные таблицы, но чаще всего это сравнение двух компиляторов или двух версий одного компилятора, либо сводная таблица, но уже устаревшая, либо вообще неполный список. В общем, сел я да и сделал полную таблицу (на основе списка Clang-a и GCC) по четырем компиляторам: Clang, GNU C++, MSVC и Intel C++.
Внимание! Данная таблица прежде всего предназначена для тех, кто пишет свой продукт. Если Вы разрабатываете библиотеку, то, естественно, лучше ознакомиться с особенностями поддержки в первоисточнике (а еще лучше на все тесты написать). Для меня она прежде всего нужда для решений вроде «О! Range-for можно уже использовать без проблем.».
| Часть стандарта | C++11 Proposal | Clang | GCC | VC Частично | 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 | ||
| Initialization of class objects by rvalues | N1610 | 2.9 | 4.0 | |||
| Non-static data member initializers | N2756 | 3.0 | 4.7 | 12.0 | ||
| Variadic templates | N2242 | 2.9 | 4.3 | 11.1 | ||
| Extending variadic template template parameters | N2555 | 2.9 | 4.4 | 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 | ||
| Removal of auto as a storage-class specifier | N2546 | 2.9 | 4.4 | 10.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 | ||
| 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 | ||
| Solving the SFINAE problem for expressions | DR339 | 2.9 | 4.4 | |||
| Alias templates | N2258 | 3.0 | 4.7 | 12.0 | 12.1 | |
| 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 | ||
| 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 | |
| Conditionally-support behavior | N1627 | 2.9 | ||||
| Changing undefined behavior into diagnosable errors | N1727 | 2.9 | 11.1 | |||
| Delegating constructors | N1986 | 3.0 | 4.7 | 12.0 | ||
| Inheriting constructors | N2540 | 3.3 | 4.8 | 13.0 | ||
| Explicit conversion operators | N2437 | 3.0 | 4.5 | 11.1 | 13.0 | |
| New character types | N2249 | 2.9 | 4.4 | 13.0 | ||
| Unicode string literals | N2442 | 3.0 | 4.5 | 13.0 | 11.0* | |
| Raw string literals | N2442 | 3.0 | 4.5 | 11.1 | ||
| Universal character names in literals | N2170 | 3.1 | 4.5 | |||
| User-defined literals | N2765 | 3.1 | 4.7 | 13.0 | ||
| Standard Layout Types | N2342 | 3.0 | 4.4 | 11.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 | ||
| Inline namespaces | N2535 | 2.9 | 4.4 | 13.0 | ||
| Unrestricted unions | N2544 | 3.1 | 4.6 | 13.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 | ||
| Allowing move constructors to throw [noexcept] | N3050 | 3.0 | 4.6 | 13.0 | ||
| Defining move special member functions | N3053 | 3.0 | 4.6 | |||
| Concurrency | ||||||
| Sequence points | N2239 | 3.3 | 4.0 | N/A | N/A | |
| Atomic operations | N2427 | 3.1 | 4.4 | 11.0 | 13.0 | |
| Strong Compare and Exchange | N2748 | 3.1* | 4.5 | 11.0 | ||
| Bidirectional Fences | N2752 | 3.1 | 4.8 | 11.0 | ||
| Memory model | N2429 | 3.2 | 4.8 | N/A | N/A | |
| Data-dependency ordering: atomics and memory model | N2664 | 3.2* | 4.4 | 11.0 | ||
| Propagating exceptions | N2179 | 2.9 | 4.4 | 10.0 | ||
| Abandoning a process and at_quick_exit | N2440 | 4.8 | 13.0 | |||
| Allow atomics use in signal handlers | N2547 | 3.1 | 4.0 | |||
| Thread-local storage | N2659 | 3.3 | 4.8 | 10.0 | 13.0 | |
| Dynamic initialization and destruction with concurrency | N2660 | 2.9 | 4.3 | 13.0 | ||
| C99 Features in C++11 | ||||||
| __func__ predefined identifier | N2340 | 2.9 | 4.3 | 10.0 | 13.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 | N/A | |
| C++14 | ||||||
| Tweak to certain C++ contextual conversions | N3323 | 3.4 | 4.9 | 12.0 | ||
| Binary literals | N3472 | 2.9 | 4.9 | 13.0 | ||
| decltype(auto) | N3638 | 3.3 | 4.8 | 13.0 | ||
| Return type deduction for normal functions | 3.4 | 4.9 | 13.0 | |||
| Initialized lambda captures | N3648 | 3.4 | 4.9 | 13.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 | |||
| 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 | ||||
| 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 | ||||
| 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 | GCC Concepts | |||
Примечания.
- В таблице могут быть неточности, ибо составлялась она, по большей части, вручную.
- Не указана поддержка возможностей стандартной библиотеки (добавлю по настоятельной просьбе)
- * означает, что есть нюансы (хотя поддержка полная). Например, опция командной строки. Читайте первоисточники.
- No — возможность ПОКА не поддерживается;
- N/A — возможность поддержать нельзя или вообще просто не планируется.
- Для MSVC две колонки, поскольку много возможностей было сделано с частичной поддержкой.
Ссылки.
- CLang C++ 11/14/17
- GCC C++ 11, C++ 14
- Актуальный на 2012 год список ссылок от Скотта Мейерса
- MSVS 2013 C++ 11, C++ 14
Автор: mapron
