This topic summarizes the ISO C++03, C++11, C++14, C++17, and Draft C++20 language standards conformance of compiler features and Standard Library features for Visual C++ in Visual Studio 2017 and earlier versions. Each compiler and standard library feature name links to the ISO C++ Standard proposal paper that describes the feature, if one is available at publication time. The Supported column lists the Visual Studio version in which support for the feature first appeared.
A group of papers listed together indicates that a feature was voted into the Standard, and then one or more papers to improve or expand that feature were also voted in. These features are implemented together.
No means not yet implemented. Partial means the implementation in Visual Studio 2017 is incomplete. For more details, see the Notes section. N/A means the proposal papers do not describe features. These papers altered the language of the standard, but didn’t create any work for implementers. They’re listed here for completeness. VS 2010 indicates features that are supported in Visual Studio 2010. VS 2013 indicates features that are supported in Visual Studio 2013. VS 2015 indicates features that are supported in Visual Studio 2015 RTM. VS 2015.2 and VS 2015.3 indicate features that are supported in Visual Studio 2015 Update 2 and Visual Studio 2015 Update 3, respectively. VS 2017 indicates features that are supported in Visual Studio 2017 RTM. VS 2017 15.3 indicates features that are supported in Visual Studio 2017 version 15.3. VS 2017 15.5 indicates features that are supported in Visual Studio 2017 version 15.5.
A This ignores C++03’s dynamic exception specifications, which were deprecated in C++11. There is no plan to implement them, in expectation they’ll be removed from a future C++ Standard. B The compiler’s support for two-phase name lookup is improved but remains incomplete. C The compiler’s support for Expression SFINAE has been sufficient for the Standard Library since Visual Studio 2015 Update 2, but support remains incomplete. D The compiler’s support for C99 Preprocessor rules is incomplete in Visual Studio 2017. Variadic macros are supported, but there are many bugs in the preprocessor’s behavior. E This is marked as Not Applicable because compilers are permitted, but not required, to support extended integer types. Like GCC and Clang, we’ve chosen not to support them. F Similarly, this is marked as Not Applicable because compilers are permitted, but not required, to implement this optimization. G Supported under /std:c++14 with a suppressible warning. H This feature was available in previews of Visual Studio 2017 version 15.3, but because bugs were found, it was removed from the release. J Features that were not completed in Visual Studio 2015 are broken out elsewhere in this table. K The Filesystem TS is implemented in both <experimental/filesystem> and <filesystem> for historical reasons, but its implementation must be corrected before its namespace is moved. Until this is completed, the feature is marked as not yet implemented. L Supported by a compiler intrinsic. This intrinsic is not yet available in Clang. The feature is available but not yet enabled in Intellisense. 14 These C++17 features are always enabled, even when /std:c++14 (the default) is specified. This is either because the feature was implemented before the introduction of the /std options, or because conditional implementation was undesirably complex. 17 These features are enabled by the /std:c++17 (or /std:c++latest) compiler option. bytestd::byte is enabled by /std:c++17 (or /std:c++latest), but because it can conflict with the Windows SDK headers in some cases, it has a fine-grained opt-out macro. It can be disabled by defining _HAS_STD_BYTE as 0. C11 The Universal CRT implemented the parts of the C11 Standard Library that are required by C++17, with the exception of C99 strftime() E/O alternative conversion specifiers, C11 fopen() exclusive mode, and C11 aligned_alloc(). The latter is unlikely to be implemented, because C11 specified aligned_alloc() in a way that's incompatible with the Microsoft implementation of free(), namely, that free() must be able to handle highly aligned allocations. rem Features removed when the /std:c++17 (or /std:c++latest) compiler option is specified. These features have opt-out macros: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS, and _HAS_UNEXPECTED.