Standards conformance for the Microsoft C/C++ compiler in Visual Studio (MSVC) is a work in progress. Here's a summary of ISO Standard C and C++ language and library conformance by Visual Studio version. Each C++ compiler and standard library feature name has a link to the ISO Standard C++ proposal paper that describes the feature, when 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, see C++ conformance improvements in Visual Studio. For a list of other changes, see What's New for Microsoft 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.
C++ compiler features
C++ Standard library features
A more detailed listing of Standard Library features and bug fixes by product version is available on the GitHub Microsoft STL wiki Changelog page.
For the latest information about ongoing conformance work, see:
| Feature |
Supported |
| 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 |
| C++17 Standard library features |
Supported |
β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 F |
β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 F |
β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 G |
β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 2019 16.4 |
β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 H |
β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 I |
βP0272R1 Non-const basic_string::data() |
VS 2015.3 |
βP0295R0 gcd(), lcm() |
VS 2017 15.3 17 |
βP0298R3 std::byte |
VS 2017 15.3 17, J |
β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() |
VS 2019 16.5 20 |
β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 |
| C++17 Standard library features (Defect reports) |
Supported |
βP0682R1 Repairing Elementary String Conversions |
VS 2017 15.7 17 |
βP1164R1 Making create_directory() Intuitive |
VS 2019 16.0 14 |
| 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 |
βP0020R6 atomic<float>, atomic<double>, atomic<long double> |
VS 2019 16.2 20 |
βP0463R1 endian |
VS 2019 16.2 20 |
βP0482R6 char8_t: A type for UTF-8 characters and strings |
VS 2019 16.2 20 |
βP0600R1 [[nodiscard]] For The STL, Part 1 |
VS 2019 16.2 20 |
βP0653R2 to_address() |
VS 2019 16.2 20 |
βP0754R2 <version> |
VS 2019 16.2 20 |
βP0771R1 noexcept For std::function's Move Constructor |
VS 2019 16.2 20 |
βP0487R1 Fixing operator>>(basic_istream&, CharT*) |
VS 2019 16.3 20 |
βP0616R0 Using move() In <numeric> |
VS 2019 16.3 20 |
βP0758R1 is_nothrow_convertible |
VS 2019 16.3 20 |
βP0898R3 Standard Library Concepts |
VS 2019 16.3 20 |
βP0919R3 Heterogeneous Lookup For Unordered Containers |
VS 2019 16.3 20 |
βP1754R1 Rename Concepts to standard_case |
VS 2019 16.4 20 |
βP0325R4 to_array from LFTS with updates |
VS 2019 16.5 20 |
βP0340R3 SFINAE-Friendly underlying_type |
VS 2019 16.5 14 |
βP0356R5 bind_front() |
VS 2019 16.5 20 |
βP0439R0 enum class memory_order |
VS 2019 16.5 20 |
βP0553R4 <bit> Rotating And Counting Functions |
VS 2019 16.5 20 |
βP0556R3 <bit> ispow2(), ceil2(), floor2(), log2p1() |
VS 2019 16.5 20 |
βP0595R2 is_constant_evaluated() |
VS 2019 16.5 20 |
βP0631R8 <numbers> Math Constants |
VS 2019 16.5 20 |
βP0655R1 visit<R>() |
VS 2019 16.5 20 |
βP0738R2 istream_iterator Cleanup |
VS 2019 16.5 14 |
βP0767R1 Deprecating is_pod |
VS 2019 16.5 20 |
βP0966R1 string::reserve() Should Not Shrink |
VS 2019 16.5 20 |
βP1209R0 erase_if(), erase() |
VS 2019 16.5 20 |
βP1227R2 Signed std::ssize(), Unsigned span::size() |
VS 2019 16.5 20 |
βP1355R2 Narrow Contract For ceil2() |
VS 2019 16.5 20 |
βP1357R1 is_bounded_array, is_unbounded_array |
VS 2019 16.5 20 |
βP1612R1 Relocating endian To <bit> |
VS 2019 16.5 20 |
βP1651R0 bind_front() Should Not Unwrap reference_wrapper |
VS 2019 16.5 20 |
βP1690R1 Refining Heterogeneous Lookup For Unordered Containers |
VS 2019 16.5 20 |
βP1902R1 Missing Feature-Test Macros 2017-2019 |
VS 2019 16.5 14 |
βP0122R7 <span> βP1024R3 Enhancing span usability βP1085R2 Removing span comparisons βP1394R4 Range constructor for span βP1872R0 span should have size_type, not index_type |
VS 2019 16.6 20 |
βP0202R3 constexpr for <algorithm> and exchange() |
VS 2019 16.6 20 |
βP0357R3 Supporting Incomplete Types In reference_wrapper |
VS 2019 16.6 20 |
βP0619R4 Removing C++17-Deprecated Features In C++20 |
VS 2019 16.6 20 |
βP0879R0 constexpr for swapping functions |
VS 2019 16.6 20 |
βP0883R2 Fixing atomic initialization |
VS 2019 16.6 14 |
βP0935R0 Eradicating Unnecessarily Explicit Default Constructors |
VS 2019 16.6 14 |
βP1006R1 constexpr For pointer_traits<T*>::pointer_to() |
VS 2019 16.6 20 |
βP1165R1 Consistently Propagating Stateful Allocators In basic_string's operator+() |
VS 2019 16.6 14 |
βP1423R3 char8_t backward compatibility remediation |
VS 2019 16.6 20 |
βP1645R1 constexpr for <numeric> algorithms |
VS 2019 16.6 20 |
βP0415R1 constexpr For <complex> (Again) |
VS 2019 16.7 20 |
βP0476R2 <bit> bit_cast |
VS 2019 16.7 20 |
βP0528R3 Atomic Compare-And-Exchange With Padding Bits |
VS 2019 16.7 20 |
βP0586R2 Integer comparison functions |
VS 2019 16.7 20 |
βP0674R1 make_shared() For Arrays |
VS 2019 16.7 20 |
βP0718R2 atomic<shared_ptr<T>>, atomic<weak_ptr<T>> |
VS 2019 16.7 20 |
βP1023R0 constexpr For std::array Comparisons |
VS 2019 16.7 20 |
βP1115R3 erase()/erase_if() Return size_type |
VS 2019 16.7 20 |
βP1831R1 Deprecating volatile in the standard library |
VS 2019 16.7 20 |
βP1871R1 Concept traits should be named after concepts |
VS 2019 16.7 20 |
βP1956R1 <bit> has_single_bit(), bit_ceil(), bit_floor(), bit_width() |
VS 2019 16.7 20 |
βP1964R2 Replacing boolean With boolean-testable |
VS 2019 16.7 20 |
βP1976R2 Fixed-size span construction from dynamic range |
VS 2019 16.7 20 |
βP2091R0 Issues with range access CPOs |
VS 2019 16.7 20 |
βP2102R0 Make "implicit expression variations" more explicit |
VS 2019 16.7 20 |
βP2116R0 Remove tuple-like protocol support from fixed-extent span |
VS 2019 16.7 20 |
βP0019R8 atomic_ref |
VS 2019 16.8 20 |
βP0528R3 Library support for atomic compare-and-exchange with padding bits |
VS 2019 16.8 20 |
βP0811R3 midpoint(), lerp() |
VS 2019 16.8 20 |
βP0912R5 Library Support For Coroutines |
VS 2019 16.8 20 |
βP1001R2 execution::unseq |
VS 2019 16.8 20 |
βP1032R1 Miscellaneous constexpr |
VS 2019 16.8 20 |
βP1065R2 constexpr INVOKE |
VS 2019 16.8 20 |
βP1123R0 Editorial Guidance for merging P0019r8 and P0528r3 |
VS 2019 16.8 20 |
βP1960R0 NB Comment Changes Reviewed by SG1 |
VS 2019 16.8 20 |
βP0339R6 polymorphic_allocator<> |
VS 2019 16.9 20 |
βP0660R10 <stop_token> and jthread |
VS 2019 16.9 20 |
βP0768R1 Library Support For The Spaceship Comparison Operator <=> |
VS 2019 16.9 20 |
βP1007R3 assume_aligned() |
VS 2019 16.9 20 |
βP1020R1 Smart Pointer Creation With Default Initialization |
VS 2019 16.9 20 |
βP1135R6 The C++20 Synchronization Library |
VS 2019 16.9 20 |
βP1771R1 Library support for [[nodiscard]] for constructors |
VS 2019 16.9 20 |
βP0053R7 <syncstream> βP0753R2 osyncstream Manipulators |
VS 2019 16.10 20 |
βP0355R7 <chrono> Calendars And Time Zones |
VS 2019 16.10 20abi |
βP0408R7 Efficient access To basic_stringbuf's buffer |
VS 2019 16.10 20 |
βP0466R5 Library support for layout-compatibility and pointer-interconvertibility traits |
VS 2019 16.10 20 |
βP0475R1 Guaranteed Copy Elision For Piecewise Construction |
VS 2019 16.10 20 |
βP0591R4 Utility Functions For Uses-Allocator Construction |
VS 2019 16.10 20 |
βP0608R3 Improving variant's Converting Constructor/Assignment |
VS 2019 16.10 20 |
βP0645R10 <format> Text Formatting |
VS 2019 16.10 20abi |
βP0784R7 Library support for more constexpr containers |
VS 2019 16.10 20 |
βP0896R4 <ranges> |
VS 2019 16.10 20abi |
βP0980R1 constexpr std::string |
VS 2019 16.10 20, P |
βP1004R2 constexpr std::vector |
VS 2019 16.10 20, P |
βP1208R6 <source_location> |
VS 2019 16.10 20 |
βP1502R1 Standard Library Header Units |
VS 2019 16.10 20 |
βP1614R2 Adding Spaceship <=> To The Library |
VS 2019 16.10 20 |
βP1285R0 Improving Completeness Requirements For Type Traits |
VS 2022 v17.14 |
| C++20 Standard library features (Defect reports) |
Supported |
βP2325R3 Views Should Not Be Required To Be Default Constructible |
VS 2022 17.0 20abi |
βP2328R1 join_view should join all views of ranges |
VS 2022 17.0 20abi |
βP2367R0 Remove misuses of list-initialization from clause 24 ranges |
VS 2022 17.0 20abi |
βP2259R1 Partial LWG issue resolution: repairing Input Range Adaptors and counted_iterator |
VS 2022 17.0 23 |
| C++23 Standard library features |
Supported |
βP0288R9 move_only_function |
VS 2022 17.2 23 |
βP0323R12 <expected> |
VS 2022 17.3 23 |
βP0401R6 Providing Size Feedback In The Allocator Interface |
VS 2022 17.0 23 |
βP0448R4 <spanstream> |
VS 2022 17.1 23 |
βP0627R6 unreachable() |
VS 2022 17.2 23 |
βP0798R8 Monadic Operations For optional |
VS 2022 17.2 23 |
βP0849R8 auto(x): decay-copy In The Language |
VS 2022 17.4 23 |
βP0881R7 <stacktrace> |
VS 2022 17.4 23 |
βP0943R6 Supporting C Atomics In C++ |
VS 2022 17.1 23 |
βP1048R1 is_scoped_enum |
VS 2022 17.0 23 |
βP1072R10 basic_string::resize_and_overwrite |
VS 2022 17.1 23 |
βP1132R7 out_ptr(), inout_ptr() |
VS 2022 17.0 23 |
βP1147R1 Printing volatile Pointers |
VS 2022 17.1 23 |
βP1206R7 Conversions From Ranges To Containers |
VS 2022 17.4 23 |
βP1272R4 byteswap() |
VS 2022 17.1 23 |
βP1328R1 constexpr type_info::operator==() |
VS 2022 17.4 23 |
βP1413R3 Deprecate aligned_storage And aligned_union |
VS 2022 17.3 23 |
βP1425R4 Iterator Pair Constructors For stack And queue |
VS 2022 17.1 23 |
βP1518R2 Stop Overconstraining Allocators In Container Deduction Guides |
VS 2022 17.1 23 |
βP1659R3 ranges::starts_with, ranges::ends_with |
VS 2022 17.1 23 |
βP1679R3 contains() For basic_string/basic_string_view |
VS 2022 17.0 23 |
βP1682R3 to_underlying() For Enumerations |
VS 2022 17.0 23 |
βP1899R3 views::stride |
VS 2022 17.4 23 |
βP1951R1 Default Template Arguments For pair's Forwarding Constructor |
VS 2022 17.0 23 |
βP1989R2 Range Constructor For string_view |
VS 2022 17.0 23 |
βP2077R3 Heterogeneous Erasure Overloads For Associative Containers |
VS 2022 17.2 23 |
βP2136R3 invoke_r() |
VS 2022 17.1 23 |
βP2162R2 Inheriting from std::variant |
VS 2022 17.0 17 |
βP2166R1 Prohibit basic_string and basic_string_view from being constructed from nullptr |
VS 2022 17.0 23, R |
βP2186R2 Removed garbage collection support |
VS 2022 17.0 23, Q |
βP2251R1 Require span And basic_string_view To Be Trivially Copyable |
VS 2022 17.1 23 |
βP2273R3 constexpr unique_ptr |
VS 2022 17.3 23 |
βP2280R4 Using unknown pointers and references in constant expressions |
MSVC Build Tools version 14.5 24 |
βP2290R3 Delimited escape sequences |
MSVC Build Tools version 14.5 24 |
βP2291R3 constexpr Integral <charconv> |
VS 2022 17.4 23 |
βP2302R4 ranges::contains, ranges::contains_subrange |
VS 2022 17.4 23 |
βP2321R2 std::zip |
partial in VS 2022 17.5 23 |
βP2322R6 ranges::fold_left, ranges::fold_right, etc. |
VS 2022 17.5 23 |
βP2360R0 Extend init-statement to allow alias-declaration |
MSVC Build Tools version 14.5 24 |
βP2387R3 Pipe Support For User-Defined Range Adaptors |
VS 2022 17.4 23 |
βP2393R1 Cleaning Up Integer-Class Types |
VS 2022 17.2 23 |
βP2401R0 Conditional noexcept For exchange() |
VS 2022 17.1 23 |
βP2408R5 Ranges Iterators As Inputs To Non-Ranges Algorithms |
VS 2022 17.4 23 |
βP2417R2 More constexpr bitset |
VS 2022 17.4 23 |
βP2419R2 Clarify Handling Of Encodings In Localized Formatting Of chrono Types |
VS 2022 17.4 23 |
βP2437R1 Support for #warning |
MSVC Build Tools version 14.50 24 |
βP2438R2 string::substr() && |
VS 2022 17.4 23 |
βP2440R1 ranges::iota, ranges::shift_left, ranges::shift_right |
VS 2022 17.4 23 |
βP2441R2 views::join_with |
VS 2022 17.4 23 |
βP2442R1 Windowing Range Adaptors: views::chunk, views::slide |
VS 2022 17.3 23 |
βP2443R1 views::chunk_by |
VS 2022 17.3 23 |
βP2445R1 forward_like() |
VS 2022 17.4 23 |
βP2446R2 views::as_rvalue |
VS 2022 17.4 23 |
βP2465R3 Standard Library Modules std And std.compat |
no |
βP2494R2 Relaxing Range Adaptors To Allow Move-Only Types |
VS 2022 17.4 23 |
βP2499R0 string_view Range Constructor Should Be explicit |
VS 2022 17.4 23 |
βP2508R1 basic_format_string, format_string, wformat_string |
VS 2022 17.5 23 |
βP2517R1 Conditional noexcept For apply() |
VS 2022 17.4 23 |
βP2520R0 move_iterator<T*> Should Be A Random-Access Iterator |
VS 2022 17.4 23 |
βP2549R1 unexpected<E>::error() |
VS 2022 17.3 23 |
A group of papers listed together indicates a Standard feature along with one or more approved improvements or expansions. These features are implemented together.
C Standard library features
| Feature |
Supported |
| C99 Standard library features |
Supported |
βAlternative spellings macros <iso646.h> |
VS 2015 |
βWide character support <wchar.h> and <wctype.h> |
VS 2015 |
βComplex support in <complex.h> |
Partial in VS 2015 K |
βType generic math functions <tgmath.h> |
VS 2019 16.8 2104 |
βAdditional floating point characteristics <float.h> |
VS 2015 |
βHexadecimal float printf specifiers %A, %a |
VS 2015 |
βExtended integers types <inttypes.h>, <stdint.h> |
VS 2015 |
βvscanf family in <stdio.h> and <wchar.h> |
VS 2015 |
βNew math functions in <math.h> |
VS 2015 |
βTreatment of math library error conditions (math_errhandling) |
VS 2015 |
βFloating point environment access <fenv.h> |
VS 2015 |
β%lf conversion specifier for printf |
VS 2015 |
βsnprintf family of functions in <stdio.h> |
VS 2015 |
βboolean type in <stdbool.h> |
VS 2015 |
βva_copy macro |
VS 2015 |
βAdditional strftime conversion specifiers |
Partial in VS 2015 L |
| C11 Standard library features |
Supported |
βAlignment specifiers <stdalign.h> |
VS 2019 16.8 C11, 2104 |
βaligned_alloc |
No M |
βNo return specifiers <stdnoreturn.h> |
VS 2019 16.8 C11, 2104 |
βThreading support <threads.h> |
yes |
βAtomic support <stdatomic.h> |
experimental |
βchar16_t, char32_t <uchar.h> |
VS 2019 16.8 C11 |
βgets() removed |
VS 2019 16.8 C11, N |
βgets_s() |
VS 2019 16.8 C11 |
βBounds-checking interfaces (*_s APIs) |
Partial in VS 2015 C11, O |
βfopen "x" option |
VS 2019 16.8 C11 |
| βStatic assertions |
VS 2019 16.8 C11, 2104 |
βquick_exit |
VS 2019 16.8 C11 |
β<complex.h> macros |
VS 2019 16.8 C11 |
βfloating point characteristics <float.h> |
VS 2019 16.8 C11 |
βC11 threads <threads.h> |
VS 2022 17.8 C11 |
Supported values
No Not yet implemented.
Partial The implementation is incomplete. For more information, see the Notes section.
VS 2010 Supported in Visual Studio 2010.
VS 2013 Supported in Visual Studio 2013.
VS 2015 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 Supported in Visual Studio 2017 version 15.0 (RTW).
VS 2017 15.3 Supported in Visual Studio 2017 version 15.3.
VS 2017 15.5 Supported in Visual Studio 2017 version 15.5.
VS 2017 15.7 Supported in Visual Studio 2017 version 15.7.
VS 2019 16.0 Supported in Visual Studio 2019 version 16.0 (RTW).
VS 2019 16.1 Supported in Visual Studio 2019 version 16.1.
VS 2019 16.2 Supported in Visual Studio 2019 version 16.2.
VS 2019 16.3 Supported in Visual Studio 2019 version 16.3.
VS 2019 16.4 Supported in Visual Studio 2019 version 16.4.
VS 2019 16.5 Supported in Visual Studio 2019 version 16.5.
VS 2019 16.6 Supported in Visual Studio 2019 version 16.6.
VS 2019 16.7 Supported in Visual Studio 2019 version 16.7.
VS 2019 16.8 Supported in Visual Studio 2019 version 16.8.
VS 2019 16.9 Supported in Visual Studio 2019 version 16.9.
VS 2019 16.10 Supported in Visual Studio 2019 version 16.10.
VS 2022 17.0 Supported in Visual Studio 2022 version 17.0.
VS 2022 17.1 Supported in Visual Studio 2022 version 17.1.
VS 2022 17.2 Supported in Visual Studio 2022 version 17.2.
VS 2022 17.3 Supported in Visual Studio 2022 version 17.3.
VS 2022 17.4 Supported in Visual Studio 2022 version 17.4.
VS 2022 17.5 Supported in Visual Studio 2022 version 17.5.
MSVC Build Tools version 14.50 Supported in Visual Studio 2026 18.0 (MSVC compiler version 19.50) and up.
Notes
A In /std:c++14 mode, the compiler leaves dynamic exception specifications unimplemented, and treats throw() as a synonym for __declspec(nothrow). In C++17, P0003R5 removed most dynamic exception specifications, except for one vestige: the standard deprecated throw() and requires it 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, that is, enforcement via termination.
The compiler option /Zc:noexceptTypes requests the old behavior of __declspec(nothrow). It's likely that throw() will be removed in a future version of C++. To help with migrating code in response to these changes in the Standard and the Microsoft implementation, new compiler warnings for exception specification issues are added under /std:c++17 and /permissive-.
B Supported in /permissive- mode in Visual Studio 2017 version 15.7. For more information, see Two-phase name lookup support comes to MSVC.
C In Visual Studio 2019 version 16.6 and later versions, the compiler fully implements the standard C99 preprocessor via the /Zc:preprocessor option. (In Visual Studio 2017 versions 15.8 through 16.5, the compiler supports the standard C99 preprocessor via the /experimental:preprocessor compiler option.) This option is on by default when the compiler option /std:c11 or /std:c17 is specified.
D Supported under /std:c++14 with a suppressible warning, C4984.
E The implementation is sufficient to support the C++20 Standard Library. A complete implementation requires a binary breaking change.
F Features removed when the /std:c++17 or later compiler option is specified. To re-enable these features (to ease the transition to newer language modes), use these macros: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS, and _HAS_UNEXPECTED.
G C++17's parallel algorithms library is complete. Complete doesn't mean that every algorithm is parallelized in every case. The most important algorithms are parallelized. Execution policy signatures are provided even where the implementation doesn't parallelize algorithms. The 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
These algorithms aren't presently parallelized:
- These algorithms show no noticeable parallelism performance improvement on target hardware. All algorithms that 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 for these algorithms, which are likely in the above category anyway:
- Effective parallelism of these algorithms might be infeasible:
partial_sort, partial_sort_copy
- These algorithms aren't evaluated yet. The library might implement parallelism in a future release:
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
H This is a wholly new implementation, incompatible with the previous std::experimental version, made necessary by symlink support, bug fixes, and changes in standard-required behavior. Currently, <filesystem> provides both the new std::filesystem and the previous std::experimental::filesystem. The <experimental/filesystem> header provides only the old experimental implementation. Expect removal of the experimental implementation in the next ABI-breaking release of the libraries.
I Supported by a compiler intrinsic.
J std::byte is enabled by /std:c++17 or later, but because it can conflict with the Windows SDK headers in some cases, it has a fine-grained opt-out macro. To disable it, define _HAS_STD_BYTE as 0.
K MSVC doesn't support the _Complex keyword or native complex types. The Universal CRT <complex.h> uses implementation-specific macros to achieve the same effect. For more information, see C complex math support.
L The Universal CRT doesn't implement the strftime E and O alternative conversion modifiers. These modifiers are ignored (for example, %Oe behaves the same as %e). The underlying locale APIs donβt support the modifiers.
M The Universal CRT doesn't implement C11 aligned_alloc, but does provide _aligned_malloc and _aligned_free. Because the Windows operating system doesn't support aligned allocations, this function is unlikely to be implemented.
N The declaration is removed, but the export for the function remains for backward compatibility.
O Certain bounds-checking functions are unimplemented, or have different signatures, or aren't part of the C11 or C17 standard. These functions are unimplemented: abort_handler_s, ignore_handler_s, memset_s, set_constraint_handler_s, snprintf_s, snwprintf_s, strerrorlen_s, vsnwprintf_s. These functions have different signatures: gmtime_s, localtime_s, qsort_s, strtok_s, vsnprintf_s, wcstok_s. These functions don't appear in the standard: clearerr_s, fread_s.
P Support was added in Visual Studio 2019 version 16.10. Support for Clang was added in Visual Studio 2022 version 17.0.
Q This removes declare_reachable, undeclare_reachable, declare_no_pointers, undeclare_no_pointers, get_pointer_safety. Previously, these functions had no effect.
R This is a common source-breaking change. However, code that previously had undefined behavior at runtime is now rejected with compiler errors.
S Input range adaptors and counted_iterator are implemented in VS 2022 17.0. A future update to Visual Studio 2019 version 16.11 is planned to incorporate these changes.
T <stdatomic.h> is currently supported when compiled as C++ (/std:c++latest). It isn't yet supported when compiled as C (/std:c11 and /std:c17)
U Extended floating-point types are an optional C++23 feature. This feature won't be implemented until C++23 standardization is finalized.
V Use the compiler options /source-charset:utf-8 and /we4828 to treat source files as UTF-8 encoded.
14 These C++17 and C++20 features are always enabled, even when /std:c++14 (the default) is specified. The reason 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 later compiler option.
20 In versions through Visual Studio 2019 version 16.10, these features are enabled by the /std:c++latest compiler option. Visual Studio 2019 version 16.11 added the /std:c++20 compiler option to enable these features.
20abi Because of ongoing post-release work on the C++20 standard, <format>, the formatting parts of <chrono> (which rely on <format>), and the range factories and range adaptors from <ranges> (everything that needs the view concept) are only available under /std:c++latest. Expect these features under /std:c++20 after agreement is reached with WG21 that no further ABI-breaking changes are necessary. The remaining parts of <chrono> and the algorithms that apply to ranges are enabled under the /std:c++20 compiler option in Visual Studio 2019 version 16.11 and later versions.
23 In Visual Studio 2022 version 17.0 and up, these features are enabled by the /std:c++latest compiler option.
24 In MSVC Build Tools version 14.50 and up (first shipped with Visual Studio 2026 version 18.0), these features are enabled by the /std:c++latest compiler option.
C11 Compiler support for C11 and C17 requires Visual Studio 2019 version 16.8 or higher. Except as noted, C11 and C17 library support requires Windows SDK build 10.0.20211.0 or higher. For more information on how to install support for C11 and C17, see Install C11 and C17 support in Visual Studio.
DR These features are enabled in all C++ /std compiler option modes. The C++ Standard committee adopted this change as a retroactive Defect Report to C++11 and all later versions.
2104 C11 library support for this feature requires Windows SDK build 10.0.20348.0 (version 2104) or higher.
See also
C++ Language Reference
C++ Standard Library
C++ conformance improvements in Visual Studio
What's New for Microsoft C++ in Visual Studio
Visual C++ change history 2003 through 2015
Visual C++ What's New 2003 through 2015
C++ team blog