habrahabr

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

  • понедельник, 8 декабря 2014 г. в 02:11:22
http://habrahabr.ru/post/245175/

Как любому C++ разработчику, следящему за новинками в отрасли и стандартами в частности, мне стало интересно, насколько полно вообще поддерживается стандарт C++ 11 (а также 1y и 1z) разными компиляторами? Да, существуют разные сводные таблицы, но чаще всего это сравнение двух компиляторов или двух версий одного компилятора, либо сводная таблица, но уже устаревшая, либо вообще неполный список. В общем, сел я да и сделал полную таблицу (на основе списка Clang-a и GCC) по четырем компиляторам: Clang, GNU C++, MSVC и Intel C++.
Внимание! Данная таблица прежде всего предназначена для тех, кто пишет свой продукт. Если Вы разрабатываете библиотеку, то, естественно, лучше ознакомиться с особенностями поддержки в первоисточнике (а еще лучше на все тесты написать). Для меня она прежде всего нужда для решений вроде «О! Range-for можно уже использовать без проблем.».
Часть стандарта 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**    
Примечания.
  • В таблице могут быть неточности, ибо составлялась она, по большей части, вручную;
  • Не указана поддержка возможностей стандартной библиотеки (добавлю по настоятельной просьбе) ;
  • * означает, что есть нюансы (хотя поддержка полная). Например, опция командной строки — читайте первоисточники;
  • No — возможность ПОКА не поддерживается;
  • N/A — возможность поддержать нельзя или вообще просто не планируется;
  • Для MSVC указан диапазон в случае, когда есть две версии с Partial support и с Full support. Если Full support до сих пор не объявлен, второе значение после диапазона — знак вопроса;
  • ** GCC Concepts Lite ветка.

Ссылки.
  1. CLang C++ 11/14/17
  2. GCC: таблица C++ 11, таблица C++ 14, список улучшений, которые добавят в GCC 5
  3. Актуальный на 2012 год список ссылок от Скотта Мейерса
  4. MSVS 2013 C++ 11, C++ 14
  5. Intel C++ 11
  6. Поздно нашел — Таблица (идентичная ей английская версия) с поддержкой множества разных компиляторов, только список неполный (40 из 80 представленных здесь).

Дополнительная литература:
  1. Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14 (ссылка на издательство). Скотт Мейерс — Эффективный современный С++ (С++11/14)
  2. A tour of C++ — Bjarne Stroustrup


P.S. И да, естественно, не стоит никаких делать выводов о превосходстве одного компилятора над другим. У каждого из представленных в таблице есть свои киллер-фичи и области применения. Впрочем, вряд ли для серьезного проекта будет рассматриваться компилятор только по количеству «синтаксических плюшек» (утрируя). Будьте разумны!

UPD: Судя по результатам опроса (предсказуемо), большинство считает, что по STL информация нужна. Слегка изучив этот вопрос, я понял что составить аналогичное сравнение уйдет не час и не два. Так что я сделаю это если дойдут руки, и в таком случае просто изменю заголовок на ("… и STL"). У кого топик будет в закладках, будут знать, что информация обновлена.