Difference between revisions of "C++17 support in compilers"

From KlayGE
Jump to: navigation, search
Line 4: Line 4:
 
! Language Feature !! Proposal !! MSVC !! GCC !! ICC !! Clang !! Alternative
 
! Language Feature !! Proposal !! MSVC !! GCC !! ICC !! Clang !! Alternative
 
|-
 
|-
| static_assert with no message || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3928.pdf N3928] || {{No}}No || {{Yes}}6.0 || {{No}}No || {{Yes}}3.5 || C++11's static_assert
+
| static_assert with no message || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3928.pdf N3928] || {{Yes}}15.0 || {{Yes}}6 || {{No}}No || {{Yes}}3.5 || C++11's static_assert
 
|-
 
|-
 
| Disabling trigraph expansion by default || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4086.html N4086] || {{Yes}}12.0 || {{Yes}}5.1 || {{No}}No || {{Yes}}3.5 ||
 
| Disabling trigraph expansion by default || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4086.html N4086] || {{Yes}}12.0 || {{Yes}}5.1 || {{No}}No || {{Yes}}3.5 ||
 
|-
 
|-
| typename in a template template parameter || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4051.html N4051] || {{Yes}}14.0 || {{No}}No || {{No}}No || {{Yes}}3.5 ||
+
| typename in a template template parameter || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4051.html N4051] || {{Yes}}14.0 || {{Yes}}5 || {{No}}No || {{Yes}}3.5 ||
 
|-
 
|-
| New auto rules for direct-list-initialization || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html N3922] || {{Yes}}14.0 || {{No}}No || {{No}}No || {{Yes}}3.8 ||
+
| New auto rules for direct-list-initialization || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html N3922] || {{Yes}}14.0 || {{Yes}}5 || {{No}}No || {{Yes}}3.8 ||
 
|-
 
|-
| Fold expressions || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html N4295] || {{No}}No || {{Yes}}6.0 || {{No}}No || {{Yes}}3.6 ||
+
| Fold expressions || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html N4295] || {{No}}No || {{Yes}}6 || {{No}}No || {{Yes}}3.6 ||
 
|-
 
|-
| Attributes for namespaces and enumerators || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4266.html N4266] || {{Yes}}14.0 || {{Yes}}6.0 || {{No}}No || {{Yes}}3.6 ||
+
| Attributes for namespaces and enumerators || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4266.html N4266] || {{Yes}}14.0 || {{Yes}}6 || {{No}}No || {{Yes}}3.6 ||
 
|-
 
|-
| u8 character literals || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4267.html N4267] || {{Yes}}14.0 || {{Yes}}6.0 || {{No}}No || {{Yes}}3.6 ||
+
| u8 character literals || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4267.html N4267] || {{Yes}}14.0 || {{Yes}}6 || {{No}}No || {{Yes}}3.6 ||
 
|-
 
|-
| Nested namespace definition || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html N4230] || {{No}}No || {{Yes}}6.0 || {{No}}No || {{Yes}}3.6 ||
+
| Nested namespace definition || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html N4230] || {{Yes}}15.0 || {{Yes}}6 || {{No}}No || {{Yes}}3.6 ||
 
|-
 
|-
| Allow constant evaluation for all non-type template arguments || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4268.html N4268] || {{No}}No || {{Yes}}6.0 || {{No}}No || {{Yes}}3.6 ||
+
| Allow constant evaluation for all non-type template arguments || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4268.html N4268] || {{No}}No || {{Yes}}6 || {{No}}No || {{Yes}}3.6 ||
 +
|-
 +
| Remove deprecated register storage class || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0001r1.html P0001R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.8 ||
 +
|-
 +
| Remove deprecated bool increment || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0002r1.html P0002R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.8 ||
 +
|-
 +
| Make exception specifications part of the type system || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0012r1.html P0012R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| __has_include in preprocessor conditionals || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0061.html P0061R1] || {{No}}No || {{Yes}}5 || {{No}}No || {{Yes}}Yes ||
 +
|-
 +
| New specification for inheriting constructors (DR1941 et al) || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0136r1.html P0136R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| [[fallthrough]] attribute || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0188r1.pdf P0188R1] || {{Yes}}15.0 || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| [[nodiscard]] attribute || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0189r1.pdf P0189R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| [[maybe_unused]] attribute || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0212r1.pdf P0212R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Aggregate initialization of classes with base classes || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0017r1.html P0017R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| constexpr lambda expressions || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0170r1.pdf P0170R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Unary Folds and Empty Parameter Packs || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0036r0.pdf P0036R0] || {{No}}No || {{Yes}}6 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Differing begin and end types in range-based for || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0184r0.html P0184R0] || {{Yes}}15.0 || {{Yes}}6 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Lambda capture of *this || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0018r3.html P0018R3] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Direct-list-initialization of enums || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf P0138R2] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Hexadecimal floating-point literals || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0245r1.html P0245R1] || {{No}}No || {{Yes}}3.0 || {{No}}No || {{Yes}}Yes ||
 +
|-
 +
| Using attribute namespaces without repetition || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0028r4.html P0028R4] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Dynamic memory allocation for over-aligned data || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r4.html P0035R4] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Template argument deduction for class templates || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html P0091R3] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Non-type template parameters with auto type || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0127r2.html P0127R2] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Guaranteed copy elision || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0135r1.html P0135R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Stricter expression evaluation order || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf P0145R3] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Requirement to ignore unknown attributes || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0283r2.html P0283R2] || {{No}}No || {{Yes}}Yes || {{No}}No || {{Yes}}Yes ||
 +
|-
 +
| constexpr if-statements || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0292r2.html P0292R2] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Inline variables || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0386r2.pdf P0386R2] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Structured bindings || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0217r3.html P0217R3] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Separate variable and condition for if and switch || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0305r1.html P0305R1] || {{No}}No || {{Yes}}7 || {{No}}No || {{Yes}}3.9 ||
 +
|-
 +
| Matching template template parameters to compatible arguments || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0522r0.html P0522R0] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Removing deprecated dynamic exception specifications || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0003r5.html P0003R5] || {{No}}No || {{Yes}}7 || {{No}}No || {{No}}No ||
 +
|-
 +
| Pack expansions in using-declarations || [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0195r2.html P0195R2] || {{No}}No || {{No}}No || {{No}}No || {{No}}No ||
 
|}
 
|}
  
Line 30: Line 88:
 
== References ==
 
== References ==
 
*[http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx C++11/14/17 Features In VS 2015 RTM]
 
*[http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx C++11/14/17 Features In VS 2015 RTM]
 +
*[https://blogs.msdn.microsoft.com/vcblog/2016/10/07/compiler-tools-layout-in-visual-studio-15/ C++14/17 Features and STL Fixes in VS “15” Preview 5]
 
*[https://gcc.gnu.org/projects/cxx-status.html C++ Standards Support in GCC]
 
*[https://gcc.gnu.org/projects/cxx-status.html C++ Standards Support in GCC]
 
*[http://clang.llvm.org/cxx_status.html C++ Support in Clang]
 
*[http://clang.llvm.org/cxx_status.html C++ Support in Clang]

Revision as of 01:56, 2 January 2017

C++17 Core Language Features

Language Feature Proposal MSVC GCC ICC Clang Alternative
static_assert with no message N3928 15.0 6 No 3.5 C++11's static_assert
Disabling trigraph expansion by default N4086 12.0 5.1 No 3.5
typename in a template template parameter N4051 14.0 5 No 3.5
New auto rules for direct-list-initialization N3922 14.0 5 No 3.8
Fold expressions N4295 No 6 No 3.6
Attributes for namespaces and enumerators N4266 14.0 6 No 3.6
u8 character literals N4267 14.0 6 No 3.6
Nested namespace definition N4230 15.0 6 No 3.6
Allow constant evaluation for all non-type template arguments N4268 No 6 No 3.6
Remove deprecated register storage class P0001R1 No 7 No 3.8
Remove deprecated bool increment P0002R1 No 7 No 3.8
Make exception specifications part of the type system P0012R1 No 7 No No
__has_include in preprocessor conditionals P0061R1 No 5 No Yes
New specification for inheriting constructors (DR1941 et al) P0136R1 No 7 No 3.9
fallthrough attribute P0188R1 15.0 7 No 3.9
nodiscard attribute P0189R1 No 7 No 3.9
maybe_unused attribute P0212R1 No 7 No 3.9
Aggregate initialization of classes with base classes P0017R1 No 7 No 3.9
constexpr lambda expressions P0170R1 No 7 No No
Unary Folds and Empty Parameter Packs P0036R0 No 6 No 3.9
Differing begin and end types in range-based for P0184R0 15.0 6 No 3.9
Lambda capture of *this P0018R3 No 7 No 3.9
Direct-list-initialization of enums P0138R2 No 7 No 3.9
Hexadecimal floating-point literals P0245R1 No 3.0 No Yes
Using attribute namespaces without repetition P0028R4 No 7 No 3.9
Dynamic memory allocation for over-aligned data P0035R4 No 7 No No
Template argument deduction for class templates P0091R3 No 7 No No
Non-type template parameters with auto type P0127R2 No 7 No No
Guaranteed copy elision P0135R1 No 7 No No
Stricter expression evaluation order P0145R3 No 7 No No
Requirement to ignore unknown attributes P0283R2 No Yes No Yes
constexpr if-statements P0292R2 No 7 No 3.9
Inline variables P0386R2 No 7 No 3.9
Structured bindings P0217R3 No 7 No No
Separate variable and condition for if and switch P0305R1 No 7 No 3.9
Matching template template parameters to compatible arguments P0522R0 No 7 No No
Removing deprecated dynamic exception specifications P0003R5 No 7 No No
Pack expansions in using-declarations P0195R2 No No No No

See Also

C++11 support in compilers

C++14 support in compilers

References