Microsoft C++ Language Conformance Table

This topic summarizes the ISO C++03, C++11, C++14, C++17, and C++20 language standards conformance of compiler features and Standard Library features for the Microsoft C++ compiler in Visual Studio 2019 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.

For details on conformance improvements and other changes in Visual Studio 2017 or Visual Studio 2019, set the version selector in the upper left of this page, then see C++ conformance improvements in Visual Studio and What's New for Visual C++ in Visual Studio. For conformance changes in earlier versions, see Visual C++ change history and Visual C++ What's New 2003 through 2015. For current news from the C++ team, visit the C++ team blog.

Note

There are no binary breaking changes between Visual Studio 2015, Visual Studio 2017, and Visual Studio 2019.

Compiler Features

Feature Area
C++03/11 Core Language Features Supported
  Everything else VS 2015 A
  Two-phase name lookup VS 2017 15.7 B
  N2634 Expression SFINAE VS 2017 15.7
  N1653 C99 preprocessor Partial C
C++14 Core Language Features Supported
  N3323 Tweaked wording for contextual conversions VS 2013
  N3472 Binary literals VS 2015
  N3638 auto and decltype(auto) return types VS 2015
  N3648 init-captures VS 2015
  N3649 Generic lambdas VS 2015
  N3760 [[deprecated]] attribute VS 2015
  N3778 Sized deallocation VS 2015
  N3781 Digit separators VS 2015
  N3651 Variable templates VS 2015.2
  N3652 Extended constexpr VS 2017 15.0
  N3653 Default member initializers for aggregates VS 2017 15.0
C++17 Core Language Features Supported
  N4086 Removing trigraphs VS 2010 14
  N3922 New rules for auto with braced-init-lists VS 2015 14
  N4051 typename in template template-parameters VS 2015 14
  N4266 Attributes for namespaces and enumerators VS 2015 14
  N4267 u8 character literals VS 2015 14
  N4230 Nested namespace definitions VS 2015.3 17
  N3928 Terse static_assert VS 2017 15.0 17
  P0184R0 Generalized range-based for-loops VS 2017 15.0 14
  P0188R1 [[fallthrough]] attribute VS 2017 15.0 17
  P0001R1 Removing the register keyword VS 2017 15.3 17
  P0002R1 Removing operator++ for bool VS 2017 15.3 17
  P0018R3 Capturing *this by value VS 2017 15.3 17
  P0028R4 Using attribute namespaces without repetition VS 2017 15.3 17
  P0061R1 __has_include VS 2017 15.3 14
  P0138R2 Direct-list-init of fixed enums from integers VS 2017 15.3 17
  P0170R1 constexpr lambdas VS 2017 15.3 17
  P0189R1 [[nodiscard]] attribute VS 2017 15.3 17
  P0212R1 [[maybe_unused]] attribute VS 2017 15.3 17
  P0217R3 Structured bindings VS 2017 15.3 17
  P0292R2 constexpr if-statements VS 2017 15.3 D
  P0305R1 Selection statements with initializers VS 2017 15.3 17
  P0245R1 Hexfloat literals VS 2017 15.5 17
  N4268 Allowing more non-type template args VS 2017 15.5 17
  N4295 Fold expressions VS 2017 15.5 17
  P0003R5 Removing dynamic-exception-specifications VS 2017 15.5 17
  P0012R1 Adding noexcept to the type system VS 2017 15.5 17
  P0035R4 Over-aligned dynamic memory allocation VS 2017 15.5 17
  P0386R2 Inline variables VS 2017 15.5 17
  P0522R0 Matching template template-parameters to compatible arguments VS 2017 15.5 17
  P0036R0 Removing some empty unary folds VS 2017 15.5 17
  N4261 Fixing qualification conversions VS 2017 15.7 17
  P0017R1 Extended aggregate initialization VS 2017 15.7 17
  P0091R3 Template argument deduction for class templates
  P0512R0 Class template argument deduction issues
VS 2017 15.7 17
  P0127R2 Declaring non-type template parameters with auto VS 2017 15.7 17
  P0135R1 Guaranteed copy elision VS 2017 15.6
  P0136R1 Rewording inheriting constructors VS 2017 15.7 17
  P0137R1 std::launder VS 2017 15.7 17
  P0145R3 Refining expression evaluation order
  P0400R0 Order of evaluation of function arguments
VS 2017 15.7 17
  P0195R2 Pack expansions in using-declarations VS 2017 15.7 17
  P0283R2 Ignoring unrecognized attributes VS 2015 14
Feature Area
C++17 Core Language Features (Defect Reports) Supported
  P0702R1 Fixing class template argument deduction for initializer-list ctors VS 2017 15.7 17
  P0961R1 Relaxing the structured bindings customization point finding rules VS 2019 16.0 17
  P0969R0 Allowing structured bindings to accessible members VS 2019 16.0 17
  P0588R1 Simplifying implicit lambda capture No
  P0962R2 Relaxing the range-for loop customization point finding rules No
  P0929R2 Checking for abstract class types No
  P1009R2 Array size deduction in new-expressions No
  P1286R2 Contra CWG DR1778 No
Feature Area
---- ---
C++20 Core Language Features Supported
  P0704R1 Fixing const lvalue ref-qualified pointers to members VS 2015 14
  P1041R4 Make char16_t/char32_t string literals be UTF-16/32 VS 2015 14
  P1330R0 Changing the active member of a union inside constexpr VS 2017 15.0 14
  P0972R0 noexcept For <chrono> zero(), min(), max() VS 2017 15.7 14
  P0515R3 Three-way (spaceship) comparison operator <=> VS 2019 16.0 20
  P1008R1 Prohibiting aggregates with user-declared constructors VS 2019 16.0 20
  P0329R4 Designated initialization VS 2019 16.1 20
  P0409R2 Allowing lambda-capture [=, this] VS 2019 16.1 20
  P0515R3 Three-way (spaceship) comparison operator <=> VS 2019 16.0 20
  P0941R2 Feature-test macros VS 2019 16.0 14
  P1008R1 Prohibiting aggregates with user-declared constructors VS 2019 16.0 20
  P0846R0 ADL and function templates that are not visible VS 2019 16.1 20
  P0641R2 const mismatch with defaulted copy constructor Partial
  P0306R4 Adding __VA_OPT__ for comma omission and comma deletion No
  P0315R4 Allowing lambdas in unevaluated contexts No
  P0409R2 Allowing lambda-capture [=, this] No
  [P0428R2 Familiar template syntax for generic lambdas](http://www.open-std.org/jtc1/sc22/wg21/docs/pa pers/2017/p0428r2.pdf) No
  P0479R5 [[likely]] and [[unlikely]] attributes No
  P0542R5 Contracts No
  P0614R1 Range-based for-loops with initializers No
  P0624R2 Default constructible and assignable stateless lambdas No
  P0634R3 Down with typename! No
  P0683R1 Default member initializers for bit-fields No
  P0692R1 Relaxing access checking on specializations No
  P0722R3 Efficient sized delete for variable sized classes No
  P0732R2 Class types in non-type template parameters No
  P0734R0 Concepts No
  P0780R2 Allowing pack expansion in lambda init-capture No
  P0806R2 Deprecate implicit capture of this via [=] No
  P0840R2 [[no_unique_address]] attribute No
  P0857R0 Fixing functionality gaps in constraints No
  P0892R2 Conditional explicit No
  P0912R5 Coroutines No
  P0960R3 Allow initializing aggregates from a parenthesized list of values No
  P1002R1 try-catch blocks in constexpr functions No
  P1064R0 Allowing virtual function calls in constant expressions No
  P1073R3 Immediate functions No
  P1084R2 Today's return-type-requirements are insufficient No
  P1091R3 Extending structured bindings to be more like variable declarations No
  P1094R2 Nested inline namespaces No
  P1103R3 Modules No
  P1120R0 Consistency improvements for <=> and other comparison operators No
  P1139R2 Address wording issues related to ISO 10646 No
  P1141R2 Yet another approach for constrained declarations No
  P1185R2 <=> != == No
  P1236R1 Signed integers are two's complement No
  P1289R1 Access control in contract conditions No
  P1323R2 Contract postconditions and return type deduction No
  P1327R1 Allowing dynamic_cast, polymorphic typeid in constant expressions No
  P1353R0 Missing feature-test macros No
  P1381R1 Reference capture of structured bindings No

Standard Library Features

Feature Area
C++20 Standard Library Features Supported
  P0809R0 Comparing Unordered Containers VS 2010 14
  P0858R0 Constexpr Iterator Requirements VS 2017 15.3 17
  P0777R1 Avoiding Unnecessary Decay VS 2017 15.7 14
  P0550R2 remove_cvref VS 2019 16.0 20
  P0318R1 unwrap_reference, unwrap_ref_decay VS 2019 16.1 20
  P0457R2 starts_with()/ends_with() For basic_string/basic_string_view VS 2019 16.1 20
  P0458R2 contains() For Ordered And Unordered Associative Containers VS 2019 16.1 20
  P0646R1 list/forward_list remove()/remove_if()/unique() Return size_type VS 2019 16.1 20
  P0769R2 shift_left(), shift_right() VS 2019 16.1 20
  P0887R1 type_identity VS 2019 16.1 20
  P0019R8 atomic_ref No
  P0020R6 atomic<float>, atomic<double>, atomic<long double> No
  P0053R7 <syncstream>
  P0753R2 osyncstream Manipulators
No
  P0122R7 <span> No
  P0202R3 constexpr For <algorithm> And exchange() No
  P0339R6 polymorphic_allocator<> No
  P0340R3 SFINAE-Friendly underlying_type No
  P0355R7 <chrono> Calendars And Time Zones No
  P0356R5 bind_front() No
  P0357R3 Supporting Incomplete Types In reference_wrapper No
  P0415R1 constexpr For <complex> (Again) No
  P0439R0 enum class memory_order No
  P0463R1 endian No
  P0475R1 Guaranteed Copy Elision For Piecewise Construction No
  P0476R2 bit_cast No
  P0482R6 char8_t: A type for UTF-8 characters and strings No
  P0487R1 Fixing operator>>(basic_istream&, CharT*) No
  P0528R3 Atomic Compare-And-Exchange With Padding Bits No
  P0556R3 ispow2(), ceil2(), floor2(), log2p1() No
  P0591R4 Utility Functions For Uses-Allocator Construction No
  P0600R1 [[nodiscard]] For The STL, Part 1 No
  P0608R3 Improving variant's Converting Constructor/Assignment No
  P0616R0 Using move() In <numeric> No
  P0619R4 Removing C++17-Deprecated Features In C++20 No
  P0653R2 to_address() No
  P0655R1 visit() No
  P0674R1 make_shared() For Arrays No
  P0718R2 atomic<shared_ptr<T>>, atomic<weak_ptr<T>> No
  P0738R2 istream_iterator Cleanup No
  P0754R2 <version> No
  P0758R1 is_nothrow_convertible No
  P0767R1 Deprecating is_pod No
  P0768R1 Library Support For The Spaceship Comparison Operator <=> No
  P0771R1 noexcept For std::function's Move Constructor No
  P0811R3 midpoint(), lerp() No
  P0879R0 constexpr For Swapping Functions No
  P0896R4 <ranges> No
  P0898R3 Standard Library Concepts No
  P0912R5 Library Support For Coroutines No
  P0919R3 Heterogeneous Lookup For Unordered Containers No
  P0920R2 Precalculated Hash Value Lookup No
  P0935R0 Eradicating Unnecessarily Explicit Default Constructors No
  P0966R1 string::reserve() Should Not Shrink No
  P1001R2 execution::unseq No
  P1006R1 constexpr For pointer_traits<T*>::pointer_to() No
  P1007R3 assume_aligned() No
  P1020R1 Smart Pointer Creation With Default Initialization No
  P1023R0 constexpr For std::array Comparisons No
  P1032R1 Miscellaneous constexpr No
  P1165R1 Consistently Propagating Stateful Allocators In basic_string's operator+() No
  P1209R0 erase_if(), erase() No
  P1227R2 Signed std::ssize(), Unsigned span::size() No
  P1285R0 Improving Completeness Requirements For Type Traits No
  P1357R1 is_bounded_array, is_unbounded_array No
C++17 Standard Library Features Supported
  LWG 2221 Formatted output operator for nullptr VS 2019 16.1
  N3911 void_t VS 2015 14
  N4089 Safe Conversions In unique_ptr<T[]> VS 2015 14
  N4169 invoke() VS 2015 14
  N4190 Removing auto_ptr, random_shuffle(), And Old <functional> Stuff VS 2015 rem
  N4258 noexcept Cleanups VS 2015 14
  N4259 uncaught_exceptions() VS 2015 14
  N4277 Trivially Copyable reference_wrapper VS 2015 14
  N4279 insert_or_assign()/try_emplace() For map/unordered_map VS 2015 14
  N4280 size(), empty(), data() VS 2015 14
  N4366 Precisely Constraining unique_ptr Assignment VS 2015 14
  N4387 Improving pair And tuple VS 2015.2 14
  N4389 bool_constant VS 2015 14
  N4508 shared_mutex (Untimed) VS 2015.2 14
  N4510 Supporting Incomplete Types In vector/list/forward_list VS 2013 14
  N4562 Library Fundamentals: <algorithm> sample() VS 2017 15.0
  N4562 Library Fundamentals: <any> VS 2017 15.0
  N4562 Library Fundamentals: <memory_resource>
  P0337R0 Deleting polymorphic_allocator Assignment
VS 2017 15.6
  N4562 Library Fundamentals: <optional> VS 2017 15.0
  N4562 Library Fundamentals: <string_view> VS 2017 15.0
  N4562 Library Fundamentals: <tuple> apply() VS 2017 15.0
  N4562 Library Fundamentals: Boyer-Moore search()
  P0253R1 Fixing Searcher Return Types
VS 2017 15.3 17
  P0003R5 Removing Dynamic Exception Specifications VS 2017 15.5 17
  P0004R1 Removing Deprecated Iostreams Aliases VS 2015.2 rem
  P0005R4 not_fn()
  P0358R1 Fixes For not_fn()
VS 2017 15.5 17
  P0006R0 Variable Templates For Type Traits (is_same_v, etc.) VS 2015.2 14
  P0007R1 as_const() VS 2015.2 14
  P0013R1 Logical Operator Type Traits (conjunction, etc.) VS 2015.2 14
  P0024R2 Parallel Algorithms
  P0336R1 Renaming Parallel Execution Policies
  P0394R4 Parallel Algorithms Should terminate() For Exceptions
  P0452R1 Unifying <numeric> Parallel Algorithms
VS 2017 15.7
  P0025R1 clamp() VS 2015.3
  P0030R1 hypot(x, y, z) VS 2017 15.7
  P0031R0 constexpr For <array> (Again) And <iterator> VS 2017 15.3 17
  P0032R3 Homogeneous Interface For variant/any/optional VS 2017 15.0
  P0033R1 Rewording enable_shared_from_this VS 2017 15.5 14
  P0040R3 Extending Memory Management Tools VS 2017 15.3 17
  P0063R3 C11 Standard Library VS 2015 C11, 14
  P0067R5 Elementary String Conversions VS 2017 15.7 charconv
  P0074R0 owner_less<> VS 2015.2 14
  P0077R2 is_callable, is_nothrow_callable VS 2017 15.0
  P0083R3 Splicing Maps And Sets
  P0508R0 Clarifying insert_return_type
VS 2017 15.5 17
  P0084R2 Emplace Return Type VS 2017 15.3 17
  P0088R3 <variant> VS 2017 15.0
  P0092R1 <chrono> floor(), ceil(), round(), abs() VS 2015.2 14
  P0152R1 atomic::is_always_lock_free VS 2017 15.3 17
  P0154R1 hardware_destructive_interference_size, etc. VS 2017 15.3 17
  P0156R0 Variadic lock_guard VS 2015.2 14
  P0156R2 Renaming Variadic lock_guard to scoped_lock VS 2017 15.3 17
  P0163R0 shared_ptr::weak_type VS 2017 15.0
  P0174R2 Deprecating Vestigial Library Parts VS 2017 15.5 17
  P0185R1 is_swappable, is_nothrow_swappable VS 2015.3
  P0209R2 make_from_tuple() VS 2017 15.0
  P0218R1 <filesystem>
  P0219R1 Relative Paths For Filesystem
  P0317R1 Directory Entry Caching For Filesystem
  P0392R0 Supporting string_view In Filesystem Paths
  P0430R2 Supporting Non-POSIX Filesystems
  P0492R2 Resolving NB Comments for Filesystem
VS 2017 15.7 E
  P0220R1 Library Fundamentals V1 VS 2017 15.6
  P0226R1 Mathematical Special Functions VS 2017 15.7
  P0254R2 Integrating string_view And std::string VS 2017 15.0
  P0258R2 has_unique_object_representations VS 2017 15.3 G
  P0272R1 Non-const basic_string::data() VS 2015.3
  P0295R0 gcd(), lcm() VS 2017 15.3 17
  P0298R3 std::byte VS 2017 15.3 17byte
  P0302R1 Removing Allocator Support In std::function VS 2017 15.5 17
  P0307R2 Making Optional Greater Equal Again VS 2017 15.0
  P0393R3 Making Variant Greater Equal VS 2017 15.0
  P0403R1 UDLs For <string_view> ("meow"sv, etc.) VS 2017 15.3 17
  P0414R2 shared_ptr<T[]>, shared_ptr<T[N]>
  P0497R0 Fixing shared_ptr For Arrays
VS 2017 15.5 14
  P0418R2 atomic compare_exchange memory_order Requirements VS 2017 15.3 14
  P0426R1 constexpr For char_traits VS 2017 15.7
  P0433R2 Integrating template deduction for class templates into the standard library
  P0739R0 Improving class template argument deduction integration into the standard library
VS 2017 15.7
  P0435R1 Overhauling common_type
  P0548R1 Tweaking common_type and duration
VS 2017 15.3 14
  P0504R0 Revisiting in_place_t/in_place_type_t<T>/in_place_index_t<I> VS 2017 15.0
  P0505R0 constexpr For <chrono> (Again) VS 2017 15.3 17
  P0510R0 Rejecting variants Of Nothing, Arrays, References, And Incomplete Types VS 2017 15.0
  P0513R0 Poisoning hash
  P0599R1 noexcept hash
VS 2017 15.3 14
  P0516R0 Marking shared_future Copying As noexcept VS 2017 15.3 14
  P0517R0 Constructing future_error From future_errc VS 2017 15.3 14
  P0521R0 Deprecating shared_ptr::unique() VS 2017 15.5 17
  P0558R1 Resolving atomic<T> Named Base Class Inconsistencies VS 2017 15.3 14
  P0595R2 std::is_constant_evaluated() No
  P0602R4 Propagating Copy/Move Triviality In variant/optional VS 2017 15.317
  P0604R0 Changing is_callable/result_of To invoke_result, is_invocable, is_nothrow_invocable VS 2017 15.3 17
  P0607R0 Inline Variables for the Standard Library VS 2017 15.5 17
  P0618R0 Deprecating <codecvt> VS 2017 15.5 17
  P0682R1 Repairing Elementary String Conversions VS 2015 15.7 17
C++14 Standard Library Features Supported
  N3462 SFINAE-Friendly result_of VS 2015.2
  N3302 constexpr For <complex> VS 2015
  N3469 constexpr For <chrono> VS 2015
  N3470 constexpr For <array> VS 2015
  N3471 constexpr For <initializer_list>, <tuple>, <utility> VS 2015
  N3545 integral_constant::operator()() VS 2015
  N3642 UDLs For <chrono>, <string> (1729ms, "meow"s, etc.) VS 2015
  N3644 Null Forward Iterators VS 2015
  N3654 quoted() VS 2015
  N3657 Heterogeneous Associative Lookup VS 2015
  N3658 integer_sequence VS 2015
  N3659 shared_mutex (Timed) VS 2015
  N3668 exchange() VS 2015
  N3669 Fixing constexpr Member Functions Without const VS 2015
  N3670 get<T>() VS 2015
  N3671 Dual-Range equal(), is_permutation(), mismatch() VS 2015
  N3778 Sized Deallocation VS 2015
  N3779 UDLs For <complex> (3.14i, etc.) VS 2015
  N3789 constexpr For <functional> VS 2015
  N3887 tuple_element_t VS 2015
  N3891 Renaming shared_mutex (Timed) To shared_timed_mutex VS 2015
  N3346 Minimal Container Element Requirements VS 2013
  N3421 Transparent Operator Functors (less<>, etc.) VS 2013
  N3655 Alias Templates For <type_traits> (decay_t, etc.) VS 2013
  N3656 make_unique() VS 2013

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.

Supported values

No means not yet implemented.
Partial means the implementation is incomplete. For more details, see the Notes section.
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 RTW.
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 15.0 indicates features that are supported in Visual Studio 2017 version 15.0 (RTW).
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.
VS 2017 15.7 indicates features that are supported in Visual Studio 2017 version 15.7.
VS 2019 16.0 indicates features that are supported in Visual Studio 2019 version 16.0 (RTW).
VS 2019 16.1 indicates features that are supported in Visual Studio 2019 version 16.1.

Notes

A In /std:c++14 mode, dynamic exception specifications remain unimplemented, and throw() is still treated as a synonym for __declspec(nothrow). In C++17, dynamic exception specifications were mostly removed by P0003R5, leaving one vestige: throw() is deprecated and required to behave as a synonym for noexcept. In /std:c++17 mode, MSVC now conforms to the Standard by giving throw() the same behavior as noexcept, i.e. enforcement via termination.

The compiler option /Zc:noexceptTypes requests our old behavior of __declspec(nothrow). It’s likely that throw() will be removed in C++20. To help with migrating code in response to these changes in the Standard and our implementation, new compiler warnings for exception specification issues have been added under /std:c++17 and /permissive-.

B Supported in /permissive- mode in Visual Studio 2017 version 15.7. see Two-phase name lookup support comes to MSVC for more information.

C 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. We are overhauling the preprocessor, and will experimentally ship those changes under the /permissive- mode soon.

D Supported under /std:c++14 with a suppressible warning, C4984.

E This is a completely new implementation, incompatible with the previous std::experimental version, necessitated by symlink support, bug fixes, and changes in standard-required behavior. Currently, including <filesystem> provides the new std::filesystem and the previous std::experimental::filesystem, and including <experimental/filesystem> provides only the old experimental implementation. The experimental implementation will be REMOVED in the next ABI-breaking release of the libraries.

G Supported by a compiler intrinsic.

14 These C++17/20 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.

20 These features are enabled by the /std:c++latest compiler option. When the C++20 implementation is complete, a new /std:c++20 compiler option will be added, under which these features will also be available.

byte std::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 can be re-enabled to ease the transition to newer language modes by use of these macros: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS, and _HAS_UNEXPECTED.

charconv from_chars() and to_chars() are available for integers. The timeline for floating-point from_chars() and floating-point to_chars() is as follows:

  • VS 2017 15.7: Integer from_chars() and to_chars().
  • VS 2017 15.8: Floating-point from_chars().
  • VS 2017 15.9: Floating-point to_chars() overloads for shortest decimal.
  • VS 2019 16.0: Floating-point to_chars() overloads for shortest hex and precision hex.
  • VS 2019 16.2: Floating-point to_chars() overloads for precision fixed and precision scientific.
  • Not yet implemented: The floating-point to_chars() overload for precision general.

parallel C++17’s parallel algorithms library is complete. This doesn’t mean every algorithm is parallelized in every case; the most important algorithms have been parallelized and execution policy signatures are provided even where algorithms are not parallelized. Our implementation’s central internal header, yvals_core.h, contains the following "Parallel Algorithms Notes": C++ allows an implementation to implement parallel algorithms as calls to the serial algorithms. This implementation parallelizes several common algorithm calls, but not all.

The following algorithms are parallelized:

  • adjacent_difference, adjacent_find, all_of, any_of, count, count_if, equal, exclusive_scan, find, find_end, find_first_of, find_if, find_if_not, for_each, for_each_n, inclusive_scan, is_heap, is_heap_until, is_partitioned, is_sorted, is_sorted_until, mismatch, none_of, partition, reduce, remove, remove_if, replace, replace_if, search, search_n, set_difference, set_intersection, sort, stable_sort, transform, transform_exclusive_scan, transform_inclusive_scan, transform_reduce

The following are not presently parallelized:

  • No apparent parallelism performance improvement on target hardware; all algorithms which merely copy or permute elements with no branches are typically memory bandwidth limited:
    • copy, copy_n, fill, fill_n, move, reverse, reverse_copy, rotate, rotate_copy, shift_left, shift_right, swap_ranges
  • Confusion over user parallelism requirements exists; likely in the above category anyway:
    • generate, generate_n
  • Effective parallelism suspected to be infeasible:
    • partial_sort, partial_sort_copy
  • Not yet evaluated; parallelism may be implemented in a future release and is suspected to be beneficial:
    • copy_if, includes, inplace_merge, lexicographical_compare, max_element, merge, min_element, minmax_element, nth_element, partition_copy, remove_copy, remove_copy_if, replace_copy, replace_copy_if, set_symmetric_difference, set_union, stable_partition, unique, unique_copy

See also

C++ Language Reference
C++ Standard Library
C++ conformance improvements in Visual Studio
What's New for Visual C++ in Visual Studio
Visual C++ change history 2003 through 2015
Visual C++ What's New 2003 through 2015
C++ team blog