Сводная таблица по поддержке C++ 11-14-17

в 5:26, , рубрики: c++, c++11

Как любому 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 две колонки, поскольку много возможностей было сделано с частичной поддержкой.

Ссылки.

  1. CLang C++ 11/14/17
  2. GCC C++ 11, C++ 14
  3. Актуальный на 2012 год список ссылок от Скотта Мейерса
  4. MSVS 2013 C++ 11, C++ 14

Автор: mapron

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js