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
and
Visual C++ What's New 2003 through 2015
. For current news from the C++ team, visit the
.
C++ compiler features
FeatureSupportedC++03/11 Core language featuresSupported Everything elseVS 2015
Two-phase name lookupVS 2017 15.7
CWG 1213 Value category of arrays and subscripts
VS 2022 17.14
VS 2017 15.7
VS 2019 16.6
C++03/11 Core language features (Defect reports)SupportedC++14 Core language featuresSupported
N3323 Tweaked wording for contextual conversions
VS 2013
VS 2015
N3638 auto and decltype(auto) return types
VS 2015
VS 2015
VS 2015
N3760 [[deprecated]] attribute
VS 2015
VS 2015
VS 2015
VS 2015 Update 2
VS 2017 15.0
N3653 Default member initializers for aggregates
VS 2017 15.0C++17 Core language featuresSupported
VS 2010
N3922 New rules for auto with braced-init-lists
VS 2015
N4051 typename in template template-parameters
VS 2015
N4266 Attributes for namespaces and enumerators
VS 2015
VS 2015
N4230 Nested namespace definitions
VS 2015.3
VS 2017 15.0
P0184R0 Generalized range-based for-loops
VS 2017 15.0
P0188R1 [[fallthrough]] attribute
VS 2017 15.0
P0001R1 Removing the register keyword
VS 2017 15.3
P0002R1 Removing operator++ for bool
VS 2017 15.3
P0018R3 Capturing *this by value
VS 2017 15.3
P0028R4 Using attribute namespaces without repetition
VS 2017 15.3
VS 2017 15.3
P0138R2 Direct-list-init of fixed enums from integers
VS 2017 15.3
VS 2017 15.3
P0189R1 [[nodiscard]] attribute
VS 2017 15.3
P0212R1 [[maybe_unused]] attribute
VS 2017 15.3
VS 2017 15.3
P0292R2 constexpr if-statements
VS 2017 15.3
P0305R1 Selection statements with initializers
VS 2017 15.3
P1381R1 Reference capture of structured bindings
VS 2017 15.3
VS 2017 15.5
N4268 Allowing more non-type template args
VS 2017 15.5
VS 2017 15.5
P0003R5 Removing dynamic-exception-specifications
VS 2017 15.5
P0012R1 Adding noexcept to the type system
VS 2017 15.5
P0035R4 Over-aligned dynamic memory allocation
VS 2017 15.5
VS 2017 15.5
P0522R0 Matching template template-parameters to compatible arguments
VS 2017 15.5
P0036R0 Removing some empty unary folds
VS 2017 15.5
N4261 Fixing qualification conversions
VS 2017 15.7
P0017R1 Extended aggregate initialization
VS 2017 15.7
P0091R3 Template argument deduction for class templates
P0512R0 Class template argument deduction issues
VS 2017 15.7
P0127R2 Declaring non-type template parameters with auto
VS 2017 15.7
P0135R1 Guaranteed copy elision
VS 2017 15.6
P0136R1 Rewording inheriting constructors
VS 2017 15.7
VS 2017 15.7
P0145R3 Refining expression evaluation order
P0400R0 Order of evaluation of function arguments
VS 2017 15.7
P0195R2 Pack expansions in using-declarations
VS 2017 15.7
P0283R2 Ignoring unrecognized attributes
VS 2015
C++17 Core language features (Defect reports)Supported
P0702R1 Fixing class template argument deduction for initializer-list ctors
VS 2017 15.7
P0961R1 Relaxing the structured bindings customization point finding rules
VS 2019 16.0
P0969R0 Allowing structured bindings to accessible members
VS 2019 16.0
P0588R1 Simplifying implicit lambda capture
VS 2019 16.4
P1771R1 [[nodiscard]] for constructors
VS 2019 16.4
P1825R0 Merged wording for P0527R1 and P1155R3, more implicit moves
VS 2019 16.4
P0929R2 Checking for abstract class types
VS 2019 16.5
P0962R1 Relaxing the range-for loop customization point finding rules
VS 2019 16.5
P0859R0 CWG 1581: When are constexpr member functions defined
Partial in VS 2019 16.7
, Full in VS 2022 17.1
P1009R2 Array size deduction in new-expressions
VS 2019 16.7
VS 2019 16.8
C++20 Core language featuresSupported
P0593R6 Implicit creation of objects for low-level object manipulation
Yes
P0641R2 const mismatch with defaulted copy constructor
VS 2015
P0704R1 Fixing const lvalue ref-qualified pointers to members
VS 2015
P1041R4 Make char16_t/char32_t string literals be UTF-16/32
VS 2015
P1330R0 Changing the active member of a union inside constexpr
VS 2017 15.0
P0972R0 noexcept For <chrono> zero(), min(), max()
VS 2017 15.7
P0515R3 Three-way (spaceship) comparison operator <=>
VS 2019 16.0
VS 2019 16.0
P1008R1 Prohibiting aggregates with user-declared constructors
VS 2019 16.0
P0329R4 Designated initialization
VS 2019 16.1
P0846R0 ADL and function templates that are not visible
VS 2019 16.1
P0409R2 Allowing lambda-capture [=, this]
VS 2019 16.2
P0428R2 Familiar template syntax for generic lambdas
VS 2019 16.2
P0624R2 Default constructible and assignable stateless lambdas
VS 2019 16.2
P0780R2 Allowing pack expansion in lambda init-capture
VS 2019 16.2
P0806R2 Deprecate implicit capture of this via [=]
VS 2019 16.2
P1120R0 Consistency improvements for <=> and other comparison operators
VS 2019 16.2
VS 2019 16.2
VS 2019 16.3
P0857R0 Fixing functionality gaps in constraints
VS 2019 16.3
P1084R2 Today's return-type-requirements are insufficient
VS 2019 16.3
VS 2019 16.4
P1091R3 Extending structured bindings to be more like variable declarations
VS 2019 16.4
VS 2019 16.4
P1186R3 When do you actually use <=>
VS 2019 16.4
P1630R1 Spaceship needs a tune-up
VS 2019 16.4
P0306R4 Adding __VA_OPT__ for comma omission and comma deletion
VS 2019 16.5. To provide better backward compatibility, __VA_OPT__ is enabled under /Zc:preprocessor across all language versions.
P0614R1 Range-based for-loops with initializers
VS 2019 16.5
P0683R1 Default member initializers for bit-fields
VS 2019 16.5
P1002R1 try-catch blocks in constexpr functions
VS 2019 16.5
P1161R3 Deprecate uses of the comma operator in subscripting expressions
VS 2019 16.5
P1301R4 [[nodiscard("message")]]
VS 2019 16.5
P1703R1 Recognizing header unit imports requires full preprocessing
VS 2019 16.5
P1946R0 Allow defaulting comparisons by value
VS 2019 16.5
P0479R5 [[likely]] and [[unlikely]] attributes
VS 2019 16.6
P0692R1 Relaxing access checking on specializations
VS 2019 16.6
P0732R2 Class types in non-type template parameters
VS 2019 16.6
P1139R2 Address wording issues related to ISO 10646
VS 2019 16.6
P1907R1 Inconsistencies with non-type template parameters
VS 2019 16.6
P1971R0 US053: Mandate the return type for return_void and return_value to be void
VS 2019 16.6
P1971R0 US065: Apply Coroutines issue 24 from P0664R8
VS 2019 16.6
VS 2019 16.6
P0388R4 Permit conversions to arrays of unknown bound
VS 2019 16.7
P0466R5 Layout-compatibility and Pointer-interconvertibility Traits
VS 2019 16.7
P0722R3 Efficient sized delete for variable sized classes
VS 2019 16.7
P1094R2 Nested inline namespaces
VS 2019 16.7
VS 2019 16.7
P1331R2 Permitting trivial default initialization in constexpr contexts
VS 2019 16.7
P1358R0 2310: Type completeness and derived-to-base pointer conversions
VS 2019 16.7
P1452R2 On the non-uniform semantics of return-type-requirements
VS 2019 16.7
P1616R1 Using unconstrained TTPs with constrained templates
VS 2019 16.7
P1814R0 CTAD for alias templates
VS 2019 16.7
VS 2019 16.7
P1957R1 Converting from T* to bool should be considered narrowing (re: US 212)
VS 2019 16.7
VS 2019 16.7
P1969R0 CWG 2280: Matching a usual deallocation function with placement new
VS 2019 16.7
P1969R0 CWG 2382: Array allocation overhead for non-allocating placement new
VS 2019 16.7
P1969R0 CWG 2441: Inline function parameters
VS 2019 16.7
P1971R0 US052: Non-executed return statements in coroutines
VS 2019 16.7
P1972R0 US105: Check satisfaction of constraints for non-templates when forming pointer to function
VS 2019 16.7
P1980R0 CA096: Declaration matching for non-dependent requires-clauses
VS 2019 16.7
P2082R1 Fixing CTAD for aggregates
VS 2019 16.7
P2085R0 Consistent defaulted comparisons
VS 2019 16.7
P2103R0 US033: Allow "import" inside linkage-specifications
VS 2019 16.7
P2107R0 US064: Copy semantics of coroutine parameters
VS 2019 16.7
VS 2019 16.8
VS 2019 16.8
P0315R4 Allowing lambdas in unevaluated contexts
VS 2019 16.8
P0848R3 Conditionally trivial special member functions
VS 2019 16.8
P0960R3 Allow initializing aggregates from a parenthesized list of values
VS 2019 16.8
P1766R1 Mitigating minor modules maladies
VS 2019 16.8
P1811R0 Relaxing redefinition restrictions for re-exportation robustness
VS 2019 16.8
P1874R1 Dynamic Initialization Order of Non-Local Variables in Modules
VS 2019 16.8
P1975R0 Fixing the wording of parenthesized aggregate-initialization
VS 2019 16.8
VS 2019 16.9
P0784R7 More constexpr containers
VS 2019 16.9
P0840R2 [[no_unique_address]] attribute
VS 2019 16.9
P1064R0 Allowing virtual function calls in constant expressions
VS 2019 16.9
P1141R2 Yet another approach for constrained declarations
VS 2019 16.9
P1327R1 Allowing dynamic_cast, polymorphic typeid in constant expressions
VS 2019 16.9
P1668R1 Permitting unevaluated inline assembly in constexpr functions
VS 2019 16.9
VS 2019 16.10
VS 2019 16.10
P1353R0 Missing feature-test macros
VS 2019 16.10
P0735R1 Interaction of memory_order_consume with release sequences
VS 2022 v17.14
P1236R1 Signed integers are two's complement
VS 2022 v17.14C++23 Core language featuresSupported
P0330R8 Literal Suffix for (signed) size_t
VS 2022 17.13
VS 2022 17.13
P0849R8 auto(x): decay-copy in the language
MSVC Build Tools version 14.50
VS 2022 17.14
VS 2022 17.14
P1401R5 Narrowing contextual conversions to bool
VS 2022 17.14
P1467R9 Extended floating-point types and standard names
No
no
P1787R6 Declarations and where to find them
No change required
P1847R4 Make declaration order layout mandated
VS 2022 17.0
VS 2022 17.14
P1949R7 C++ Identifier Syntax using Unicode Standard Annex 31
MSVC Build Tools version 14.50
no
P2036R3 Change scope of lambda trailing-return-type
MSVC Build Tools version 14.50
P2071R2 Named universal character escapes
no
P2128R6 Multidimensional subscript operator
VS 2022 17.12
P2156R1 Allow Duplicate Attributes
MSVC Build Tools version 14.50
P2173R1 Attributes on Lambda-Expressions
VS 2022 17.14
P2186R2 Remove Garbage Collection Support
VS 2022 17.0
P2201R1 Mixed string literal concatenation
VS 2022 17.14
P2223R2 Trimming whitespaces before line splicing
MSVC Build Tools version 14.50
P2242R3 Non-literal variables (and labels and gotos) in constexpr functions
VS 2022 17.14
P2246R1 Character encoding of diagnostic text
VS 2022 17.0
MSVC Build Tools version 14.50
P2280R4 Using unknown pointers and references in constant expressions
MSVC Build Tools version 14.50
P2290R3 Delimited escape sequences
MSVC Build Tools version 14.50
P2295R6 Support for UTF-8 as a portable source file encoding
P2314R4 Character sets and encodings
no
P2316R2 Consistent character literal encoding
VS 2022 17.0
P2324R2 Labels at the end of compound statements (C compatibility)
no
P2327R1 De-deprecating volatile compound operations
VS 2022 v17.14
P2334R1 preprocessing directives elifdef and elifndef
VS 2022 17.10
P2360R0 Extend init-statement to allow alias-declaration
MSVC Build Tools version 14.50
P2362R3 Remove non-encodable wide character literals and multicharacter wide character literals
no
MSVC Build Tools version 14.50
P2448R2 Relaxing some constexpr restrictions
no
P2460R2 Relax requirements on wchar_t to match existing practices
VS 2022 v17.14
P2468R2 The Equality Operator You Are Looking For
VS 2022 17.6
P2493R0 Missing feature test macros for C++20 core papers
MSVC Build Tools version 14.50
P2513R4 char8_t Compatibility and Portability Fix
VS 2022 17.4
P2579R0 Mitigation strategies for P2036 "Changing scope for lambda trailing-return-type"
MSVC Build Tools version 14.50
P2582R1 Wording for class template argument deduction from inherited constructors
no
VS 2022 17.14
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:
.
.
FeatureSupportedC++14 Standard library featuresSupported
N3462 SFINAE-Friendly result_of
VS 2015.2
VS 2015
VS 2015
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
VS 2015
VS 2015
N3657 Heterogeneous Associative Lookup
VS 2015
VS 2015
VS 2015
VS 2015
N3669 Fixing constexpr Member Functions Without const
VS 2015
VS 2015
N3671 Dual-Range equal(), is_permutation(), mismatch()
VS 2015
VS 2015
N3779 UDLs For <complex> (3.14i, etc.)
VS 2015
N3789 constexpr For <functional>
VS 2015
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
VS 2013C++17 Standard library featuresSupported
VS 2015
N4089 Safe Conversions In unique_ptr<T[]>
VS 2015
VS 2015
N4190 Removing auto_ptr, random_shuffle(), And Old <functional> Stuff
VS 2015
VS 2015
VS 2015
N4277 Trivially Copyable reference_wrapper
VS 2015
N4279 insert_or_assign()/try_emplace() For map/unordered_map
VS 2015
VS 2015
N4366 Precisely Constraining unique_ptr Assignment
VS 2015
N4387 Improving pair And tuple
VS 2015.2
VS 2015
VS 2015.2
N4510 Supporting Incomplete Types In vector/list/forward_list
VS 2013
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
P0003R5 Removing Dynamic Exception Specifications
VS 2017 15.5
P0004R1 Removing Deprecated Iostreams Aliases
VS 2015.2
VS 2017 15.5
P0006R0 Variable Templates For Type Traits (is_same_v, etc.)
VS 2015.2
VS 2015.2
P0013R1 Logical Operator Type Traits (conjunction, etc.)
VS 2015.2
P0336R1 Renaming Parallel Execution Policies
P0394R4 Parallel Algorithms Should terminate() For Exceptions
P0452R1 Unifying <numeric> Parallel Algorithms
VS 2017 15.7
VS 2015.3
VS 2017 15.7
P0031R0 constexpr For <array> (Again) And <iterator>
VS 2017 15.3
P0032R3 Homogeneous Interface For variant/any/optional
VS 2017 15.0
P0033R1 Rewording enable_shared_from_this
VS 2017 15.5
P0040R3 Extending Memory Management Tools
VS 2017 15.3
VS 2015
,
P0067R5 Elementary String Conversions
VS 2019 16.4
VS 2015.2
P0077R2 is_callable, is_nothrow_callable
VS 2017 15.0
P0083R3 Splicing Maps And Sets
P0508R0 Clarifying insert_return_type
VS 2017 15.5
VS 2017 15.3
VS 2017 15.0
P0092R1 <chrono> floor(), ceil(), round(), abs()
VS 2015.2
P0152R1 atomic::is_always_lock_free
VS 2017 15.3
P0154R1 hardware_destructive_interference_size, etc.
VS 2017 15.3
VS 2015.2
P0156R2 Renaming Variadic lock_guard to scoped_lock
VS 2017 15.3
VS 2017 15.0
P0174R2 Deprecating Vestigial Library Parts
VS 2017 15.5
P0185R1 is_swappable, is_nothrow_swappable
VS 2015.3
VS 2017 15.0
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
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
P0272R1 Non-const basic_string::data()
VS 2015.3
VS 2017 15.3
VS 2017 15.3
,
P0302R1 Removing Allocator Support In std::function
VS 2017 15.5
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
P0414R2 shared_ptr<T[]>, shared_ptr<T[N]>
P0497R0 Fixing shared_ptr For Arrays
VS 2017 15.5
P0418R2 atomic compare_exchange memory_order Requirements
VS 2017 15.3
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
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
P0510R0 Rejecting variants Of Nothing, Arrays, References, And Incomplete Types
VS 2017 15.0
VS 2017 15.3
P0516R0 Marking shared_future Copying As noexcept
VS 2017 15.3
P0517R0 Constructing future_error From future_errc
VS 2017 15.3
P0521R0 Deprecating shared_ptr::unique()
VS 2017 15.5
P0558R1 Resolving atomic<T> Named Base Class Inconsistencies
VS 2017 15.3
P0595R2 std::is_constant_evaluated()
VS 2019 16.5
P0602R4 Propagating Copy/Move Triviality In variant/optional
VS 2017 15.3
P0604R0 Changing is_callable/result_of To invoke_result, is_invocable, is_nothrow_invocable
VS 2017 15.3
P0607R0 Inline Variables for the Standard Library
VS 2017 15.5
VS 2017 15.5
C++17 Standard library features (Defect reports)Supported
P0682R1 Repairing Elementary String Conversions
VS 2017 15.7
P1164R1 Making create_directory() Intuitive
VS 2019 16.0
C++20 Standard library featuresSupported
P0809R0 Comparing Unordered Containers
VS 2010
P0858R0 Constexpr Iterator Requirements
VS 2017 15.3
P0777R1 Avoiding Unnecessary Decay
VS 2017 15.7
VS 2019 16.0
P0318R1 unwrap_reference, unwrap_ref_decay
VS 2019 16.1
P0457R2 starts_with()/ends_with() For basic_string/basic_string_view
VS 2019 16.1
P0458R2 contains() For Ordered And Unordered Associative Containers
VS 2019 16.1
P0646R1 list/forward_list remove()/remove_if()/unique() Return size_type
VS 2019 16.1
P0769R2 shift_left(), shift_right()
VS 2019 16.1
VS 2019 16.1
P0020R6 atomic<float>, atomic<double>, atomic<long double>
VS 2019 16.2
VS 2019 16.2
P0482R6 char8_t: A type for UTF-8 characters and strings
VS 2019 16.2
P0600R1 [[nodiscard]] For The STL, Part 1
VS 2019 16.2
VS 2019 16.2
VS 2019 16.2
P0771R1 noexcept For std::function's Move Constructor
VS 2019 16.2
P0487R1 Fixing operator>>(basic_istream&, CharT*)
VS 2019 16.3
P0616R0 Using move() In <numeric>
VS 2019 16.3
P0758R1 is_nothrow_convertible
VS 2019 16.3
P0898R3 Standard Library Concepts
VS 2019 16.3
P0919R3 Heterogeneous Lookup For Unordered Containers
VS 2019 16.3
P1754R1 Rename Concepts to standard_case
VS 2019 16.4
P0325R4 to_array from LFTS with updates
VS 2019 16.5
P0340R3 SFINAE-Friendly underlying_type
VS 2019 16.5
VS 2019 16.5
P0439R0 enum class memory_order
VS 2019 16.5
P0553R4 <bit> Rotating And Counting Functions
VS 2019 16.5
P0556R3 <bit> ispow2(), ceil2(), floor2(), log2p1()
VS 2019 16.5
P0595R2 is_constant_evaluated()
VS 2019 16.5
P0631R8 <numbers> Math Constants
VS 2019 16.5
VS 2019 16.5
P0738R2 istream_iterator Cleanup
VS 2019 16.5
VS 2019 16.5
P0966R1 string::reserve() Should Not Shrink
VS 2019 16.5
VS 2019 16.5
P1227R2 Signed std::ssize(), Unsigned span::size()
VS 2019 16.5
P1355R2 Narrow Contract For ceil2()
VS 2019 16.5
P1357R1 is_bounded_array, is_unbounded_array
VS 2019 16.5
P1612R1 Relocating endian To <bit>
VS 2019 16.5
P1651R0 bind_front() Should Not Unwrap reference_wrapper
VS 2019 16.5
P1690R1 Refining Heterogeneous Lookup For Unordered Containers
VS 2019 16.5
P1902R1 Missing Feature-Test Macros 2017-2019
VS 2019 16.5
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
P0202R3 constexpr for <algorithm> and exchange()
VS 2019 16.6
P0357R3 Supporting Incomplete Types In reference_wrapper
VS 2019 16.6
P0619R4 Removing C++17-Deprecated Features In C++20
VS 2019 16.6
P0879R0 constexpr for swapping functions
VS 2019 16.6
P0883R2 Fixing atomic initialization
VS 2019 16.6
P0935R0 Eradicating Unnecessarily Explicit Default Constructors
VS 2019 16.6
P1006R1 constexpr For pointer_traits<T*>::pointer_to()
VS 2019 16.6
P1165R1 Consistently Propagating Stateful Allocators In basic_string's operator+()
VS 2019 16.6
P1423R3 char8_t backward compatibility remediation
VS 2019 16.6
P1645R1 constexpr for <numeric> algorithms
VS 2019 16.6
P0415R1 constexpr For <complex> (Again)
VS 2019 16.7
VS 2019 16.7
P0528R3 Atomic Compare-And-Exchange With Padding Bits
VS 2019 16.7
P0586R2 Integer comparison functions
VS 2019 16.7
P0674R1 make_shared() For Arrays
VS 2019 16.7
P0718R2 atomic<shared_ptr<T>>, atomic<weak_ptr<T>>
VS 2019 16.7
P1023R0 constexpr For std::array Comparisons
VS 2019 16.7
P1115R3 erase()/erase_if() Return size_type
VS 2019 16.7
P1831R1 Deprecating volatile in the standard library
VS 2019 16.7
P1871R1 Concept traits should be named after concepts
VS 2019 16.7
P1956R1 <bit> has_single_bit(), bit_ceil(), bit_floor(), bit_width()
VS 2019 16.7
P1964R2 Replacing boolean With boolean-testable
VS 2019 16.7
P1976R2 Fixed-size span construction from dynamic range
VS 2019 16.7
P2091R0 Issues with range access CPOs
VS 2019 16.7
P2102R0 Make "implicit expression variations" more explicit
VS 2019 16.7
P2116R0 Remove tuple-like protocol support from fixed-extent span
VS 2019 16.7
VS 2019 16.8
P0528R3 Library support for atomic compare-and-exchange with padding bits
VS 2019 16.8
VS 2019 16.8
P0912R5 Library Support For Coroutines
VS 2019 16.8
VS 2019 16.8
P1032R1 Miscellaneous constexpr
VS 2019 16.8
VS 2019 16.8
P1123R0 Editorial Guidance for merging P0019r8 and P0528r3
VS 2019 16.8
P1960R0 NB Comment Changes Reviewed by SG1
VS 2019 16.8
P0339R6 polymorphic_allocator<>
VS 2019 16.9
P0660R10 <stop_token> and jthread
VS 2019 16.9
P0768R1 Library Support For The Spaceship Comparison Operator <=>
VS 2019 16.9
VS 2019 16.9
P1020R1 Smart Pointer Creation With Default Initialization
VS 2019 16.9
P1135R6 The C++20 Synchronization Library
VS 2019 16.9
P1771R1 Library support for [[nodiscard]] for constructors
VS 2019 16.9
P0753R2 osyncstream Manipulators
VS 2019 16.10
P0355R7 <chrono> Calendars And Time Zones
VS 2019 16.10
P0408R7 Efficient access To basic_stringbuf's buffer
VS 2019 16.10
P0466R5 Library support for layout-compatibility and pointer-interconvertibility traits
VS 2019 16.10
P0475R1 Guaranteed Copy Elision For Piecewise Construction
VS 2019 16.10
P0591R4 Utility Functions For Uses-Allocator Construction
VS 2019 16.10
P0608R3 Improving variant's Converting Constructor/Assignment
VS 2019 16.10
P0645R10 <format> Text Formatting
VS 2019 16.10
P0784R7 Library support for more constexpr containers
VS 2019 16.10
VS 2019 16.10
VS 2019 16.10
,
VS 2019 16.10
,
VS 2019 16.10
P1502R1 Standard Library Header Units
VS 2019 16.10
P1614R2 Adding Spaceship <=> To The Library
VS 2019 16.10
P1285R0 Improving Completeness Requirements For Type Traits
VS 2022 v17.14C++20 Standard library features (Defect reports)Supported
P2325R3 Views Should Not Be Required To Be Default Constructible
VS 2022 17.0
P2328R1 join_view should join all views of ranges
VS 2022 17.0
P2367R0 Remove misuses of list-initialization from clause 24 ranges
VS 2022 17.0
P2259R1 Partial LWG issue resolution: repairing Input Range Adaptors and counted_iterator
VS 2022 17.0
C++23 Standard library featuresSupported
VS 2022 17.2
VS 2022 17.3
P0401R6 Providing Size Feedback In The Allocator Interface
VS 2022 17.0
VS 2022 17.1
VS 2022 17.2
P0798R8 Monadic Operations For optional
VS 2022 17.2
P0849R8 auto(x): decay-copy In The Language
VS 2022 17.4
VS 2022 17.4
P0943R6 Supporting C Atomics In C++
VS 2022 17.1
VS 2022 17.0
P1072R10 basic_string::resize_and_overwrite
VS 2022 17.1
P1132R7 out_ptr(), inout_ptr()
VS 2022 17.0
P1147R1 Printing volatile Pointers
VS 2022 17.1
P1206R7 Conversions From Ranges To Containers
VS 2022 17.4
VS 2022 17.1
P1328R1 constexpr type_info::operator==()
VS 2022 17.4
P1413R3 Deprecate aligned_storage And aligned_union
VS 2022 17.3
P1425R4 Iterator Pair Constructors For stack And queue
VS 2022 17.1
P1518R2 Stop Overconstraining Allocators In Container Deduction Guides
VS 2022 17.1
P1659R3 ranges::starts_with, ranges::ends_with
VS 2022 17.1
P1679R3 contains() For basic_string/basic_string_view
VS 2022 17.0
P1682R3 to_underlying() For Enumerations
VS 2022 17.0
VS 2022 17.4
P1951R1 Default Template Arguments For pair's Forwarding Constructor
VS 2022 17.0
P1989R2 Range Constructor For string_view
VS 2022 17.0
P2077R3 Heterogeneous Erasure Overloads For Associative Containers
VS 2022 17.2
VS 2022 17.1
P2162R2 Inheriting from std::variant
VS 2022 17.0
P2166R1 Prohibit basic_string and basic_string_view from being constructed from nullptr
VS 2022 17.0
,
P2186R2 Removed garbage collection support
VS 2022 17.0
,
P2251R1 Require span And basic_string_view To Be Trivially Copyable
VS 2022 17.1
VS 2022 17.3
P2280R4 Using unknown pointers and references in constant expressions
MSVC Build Tools version 14.5
P2290R3 Delimited escape sequences
MSVC Build Tools version 14.5
P2291R3 constexpr Integral <charconv>
VS 2022 17.4
P2302R4 ranges::contains, ranges::contains_subrange
VS 2022 17.4
partial in VS 2022 17.5
P2322R6 ranges::fold_left, ranges::fold_right, etc.
VS 2022 17.5
P2360R0 Extend init-statement to allow alias-declaration
MSVC Build Tools version 14.5
P2387R3 Pipe Support For User-Defined Range Adaptors
VS 2022 17.4
P2393R1 Cleaning Up Integer-Class Types
VS 2022 17.2
P2401R0 Conditional noexcept For exchange()
VS 2022 17.1
P2408R5 Ranges Iterators As Inputs To Non-Ranges Algorithms
VS 2022 17.4
VS 2022 17.4
P2419R2 Clarify Handling Of Encodings In Localized Formatting Of chrono Types
VS 2022 17.4
MSVC Build Tools version 14.50
VS 2022 17.4
P2440R1 ranges::iota, ranges::shift_left, ranges::shift_right
VS 2022 17.4
VS 2022 17.4
P2442R1 Windowing Range Adaptors: views::chunk, views::slide
VS 2022 17.3
VS 2022 17.3
VS 2022 17.4
VS 2022 17.4
P2465R3 Standard Library Modules std And std.compat
no
P2494R2 Relaxing Range Adaptors To Allow Move-Only Types
VS 2022 17.4
P2499R0 string_view Range Constructor Should Be explicit
VS 2022 17.4
P2508R1 basic_format_string, format_string, wformat_string
VS 2022 17.5
P2517R1 Conditional noexcept For apply()
VS 2022 17.4
P2520R0 move_iterator<T*> Should Be A Random-Access Iterator
VS 2022 17.4
P2549R1 unexpected<E>::error()
VS 2022 17.3
P2590R2 Explicit lifetime management
P2679R2 Fixing start_lifetime_as and start_lifetime_as_array
MSVC Build Tools version 14.51
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
FeatureSupportedC99 Standard library featuresSupported 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
Type generic math functions <tgmath.h>VS 2019 16.8
Additional floating point characteristics <float.h>VS 2015 Hexadecimal float printf specifiers %A, %aVS 2015 Extended integers types <inttypes.h>, <stdint.h>VS 2015vscanf 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 printfVS 2015snprintf family of functions in <stdio.h>VS 2015boolean type in <stdbool.h>VS 2015va_copy macroVS 2015 Additional strftime conversion specifiersPartial in VS 2015
C11 Standard library featuresSupported Alignment specifiers <stdalign.h>VS 2019 16.8
,
aligned_allocNo
No return specifiers <stdnoreturn.h>VS 2019 16.8
,
Threading support <threads.h>yes Atomic support <stdatomic.h>experimentalchar16_t, char32_t<uchar.h>VS 2019 16.8
gets() removedVS 2019 16.8
,
gets_s()VS 2019 16.8
Bounds-checking interfaces (*_s APIs)Partial in VS 2015
,
fopen"x" optionVS 2019 16.8
Static assertionsVS 2019 16.8
,
quick_exitVS 2019 16.8
<complex.h> macrosVS 2019 16.8
floating point characteristics <float.h>VS 2019 16.8
C11 threads <threads.h>VS 2022 17.8
Supported values
No Not yet implemented.
Partial The implementation is incomplete. For more information, see the
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
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
mode, MSVC now conforms to the Standard by giving throw() the same behavior as noexcept, that is, enforcement via termination.
The compiler option
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
and
.
B Supported in
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
option. (In Visual Studio 2017 versions 15.8 through 16.5, the compiler supports the standard C99 preprocessor via the
compiler option.) This option is on by default when the compiler option
or
is specified.
D Supported under
with a suppressible warning,
.
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
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: generate, generate_n
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.
Jstd::byte is enabled by
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
.
L The Universal CRT doesn't implement the strftimeE 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
and
. 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
(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
or later compiler option.
20 In versions through Visual Studio 2019 version 16.10, these features are enabled by the
compiler option. Visual Studio 2019 version 16.11 added the
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
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
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++
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++ conformance improvements in Visual Studio
What's New for Microsoft C++ in Visual Studio
Visual C++ change history 2003 through 2015