Skip to content

VS 2022 Changelog

Stephan T. Lavavej edited this page Mar 9, 2024 · 2 revisions

Table of Contents

For newer releases, see the current Changelog.

C++20 and C++23 features generally require the /std:c++20 and /std:c++latest compiler options, respectively.

VS 2022 17.5

  • Merged C++23 features:
    • P2322R6 #3099 ranges::fold_left, ranges::fold_right, etc.
    • P2465R3 #3108 Standard Library Modules std And std.compat
      • Initially supported for MSVC only; see tracking issue #1694 for lists of known compiler bugs and upcoming fixes.
      • Build system support is a work in progress; currently, build systems must be manually taught to compile std.ixx so you can reference std.ifc and link std.obj. (Similarly for building std.compat.ixx into std.compat.ifc and std.compat.obj.)
      • IntelliSense support is a work in progress; STL test coverage is not yet enabled.
      • Will be supported for Clang after compiler support for modules is available; see Clang's C++20 implementation status.
    • P2508R1 #3074 basic_format_string, format_string, wformat_string
  • Merged partial C++23 features:
    • P2278R4 cbegin Should Always Return A Constant Iterator:
      • The "Iterators" section, including basic_const_iterator, make_const_iterator(), and make_const_sentinel(). #3043
    • P2321R2 zip:
      • views::zip. #3035
      • Note: views::zip_transform, views::adjacent, and views::adjacent_transform are the parts that remain to be implemented.
  • Merged LWG issue resolutions:
    • LWG-3711 #2949 Missing preconditions for slide_view constructor
    • LWG-3788 #3130 jthread::operator=(jthread&&) postconditions are unimplementable under self-assignment
  • Fixed bugs:
    • Fixed compiler warnings when using Standard Library Header Units. #3069
    • Removed a non-Standard member function locale::c_str(). #3088
    • Fixed narrowing warnings when calling piecewise_constant_distribution<float>::densities() and piecewise_linear_distribution<float>::densities(). #3107
    • Fixed compiler errors when calling ranges::is_permutation with predicates that return highly unusual boolean-testable types. #3113
    • Fixed compiler errors when building the Standard Library Modules with static RTTI disabled. #3115
      • Now, building std.ixx with /GR- /D_HAS_STATIC_RTTI=0 will succeed, and std::any will simply be unavailable (as it inherently requires static RTTI).
      • Additionally, including <any> with static RTTI disabled will emit a warning message but not an error, and the feature-test macro __cpp_lib_any will indicate (by its absence) that the feature is unavailable.
    • Fixed compiler errors in reference_wrapper, thread, and variant involving incomplete types. #3101 #3148
    • When chrono::time_zone::get_info() throws an exception, fixed it to report GetLastError() as intended, instead of "The operation completed successfully." #3122
    • Fixed incorrect results returned by ellint_2(). #3077
    • Fixed error_category's default constructor to be constexpr. #3139 #3176
    • Fixed all headers to avoid emitting the off-by-default "warning C5262: implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between cases". #3162
    • Fixed compiler errors in certain <ranges> scenarios by properly constraining movable-box's copy constructors. #3171
  • Improved performance:
    • Added support for unwrapping to move_sentinel. #3098
    • Improved the performance of uniform_int_distribution by implementing Daniel Lemire's algorithm Fast Random Integer Generation in an Interval. #3012
    • Optimized gcd() to avoid a redundant shift. #3127
    • Optimized locale::classic() for a 10x speedup (times, not percent). #3048
    • Added an attribute to move(), forward(), move_if_noexcept(), and forward_like() that will allow the MSVC compiler to intrinsically implement them without emitting function calls. #3182
  • Improved throughput:
    • Significantly improved compile times for <variant> visit(). #3070
    • <format> now includes fewer headers. #3128
    • Moved random number generator machinery out of <xutility>, one of the STL's central internal headers. #3157
  • Enhanced behavior:
    • Clarified get_future()'s [[nodiscard("message")]]. #3068
    • The internal headers <xatomic.h>, <xbit_ops.h>, and <xerrc.h> are now core headers. #3116
    • Improved <format>'s compiler error messages for unformattable types. #3080
  • Improved test coverage:
    • Added test coverage for <variant> visit() invoking pointers to members. #3070
    • Expanded test coverage for forward_like(). #3072
    • Updated test coverage for views::as_rvalue. #3089
    • Expanded test coverage for bind_front() and bind_back(). #3117
    • Updated our LLVM submodule reference, including new tests, and updates to the any/optional/variant shared test code. #2976
    • Fixed bogus test code discovered by Clang 15. #3135
    • Fixed the off-by-default "exhaustive" mode of the parallel is_partitioned() test. #3174
  • Code cleanups:
    • Various cleanups (described in detail in the PRs, not repeated here). #3082 #3083 #3084 #3085 #3086 #3090 #3091 #3092 #3093 #3177 #3178
    • Improved Python scripts. #3123
    • Removed compiler bug workarounds. #3155
    • Moved <atomic> implementation details, preparing for later changes. #3124
    • Removed unnecessary partial specializations of common_type for the STL's internal 128-bit integer-class types. #3153
  • Infrastructure improvements:
    • The PR/CI system now uses spot VMs again. #3071
    • Configured Azure Pipelines to avoid running checks for draft PRs. #3078
    • Added GitHub Actions to allow contributors to move their PR cards in the Code Reviews project. #2584
    • Updated dependencies. #3104 #3155
      • Updated build compiler to VS 2022 17.4 Preview 3.
      • Updated Boost.Math to 1.80.0 (now also used by the MSVC-internal build). #3077
      • Updated Clang to 15.0.1 (now required).
      • Updated CMake to 3.24 (now required).
      • Updated Google Benchmark to 1.7.0. #3151
      • Updated Python to 3.10.8.
  • Updated _MSVC_STL_UPDATE. #3073 #3147

VS 2022 17.4

  • Merged C++23 features:
  • Merged LWG issue resolutions:
    • LWG-3564 #2961 transform_view::iterator<true>::value_type and iterator_category should use const F&
    • LWG-3617 #2966 function/packaged_task deduction guides and deducing this
    • LWG-3656 #2880 Inconsistent bit operations returning a count
    • LWG-3671 #2905 atomic_fetch_xor missing from stdatomic.h
    • LWG-3672 #2907 common_iterator::operator->() should return by value
    • LWG-3683 #2879 operator== for polymorphic_allocator cannot deduce template argument in common cases
    • LWG-3701 #2957 Make formatter<remove_cvref_t<const charT[N]>, charT> requirement explicit
    • LWG-3707 #2883 chunk_view::outer-iterator::value_type::size should return unsigned type
    • LWG-3710 #2878 The end of chunk_view for input ranges can be const
    • LWG-3712 #2943 chunk_view and slide_view should not be default_initializable
    • LWG-3715 #2946 view_interface::empty is overconstrained
    • LWG-3719 #2902 Directory iterators should be usable with default sentinel
    • LWG-3721 #2906 Allow an arg-id with a value of zero for width in std-format-spec
    • LWG-3724 #2903 decay-copy should be constrained
  • Merged proposed resolutions for LWG issues (not yet accepted for the C++ Working Draft, but we've chosen to implement this speculatively):
    • LWG-3705 #2741 Hashability shouldn't depend on basic_string's allocator
  • Fixed bugs:
    • Fixed linker errors when using <any> with our unofficially supported mode to disable exceptions. #2193
    • Fixed compiler errors when using <format> with the new compiler option /presetPadding by adding a compiler bug workaround. #2746
    • Fixed division by complex zero to behave consistently with other implementations. #2758
    • Fixed a memory leak in <syncstream>. #2763
    • Fixed compiler errors when formatting long or unsigned long values with formatter. #2768
    • Fixed a binary compatibility break in the unordered associative containers, which could cause memory corruption when linking code that was built with different versions of the STL. #2774
      • Original Versions: VS 2015 through VS 2019 16.2 inclusive.
      • Modified Versions: VS 2019 16.3 through VS 2022 17.3 inclusive.
      • Fixed Versions: VS 2022 17.4 and later.
      • The bincompat break happened when mixing Original with Modified code. All other mixing is safe: Original with Original, Modified with Modified, Fixed with Fixed, Original with Fixed, and Modified with Fixed.
    • Fixed a bug in the unordered associative containers, specific to user-defined allocators, where the containers sometimes called deallocate() with null pointers. User-defined allocators aren't required to tolerate that, so the containers now avoid such calls. #2790
    • Fixed a bug in deque, specific to rarely-used fancy pointers, where some fancy pointers weren't being destroyed. #2775
    • <chrono> formatting now accepts %x ("The locale's date representation") for year_month_day, year_month_day_last, year_month_weekday, and year_month_weekday_last. #2762
    • std::filesystem::directory_entry's constructors, assign(), and replace_filename() now call refresh() as required by the Standard and will propagate any errors (via exceptions or error_codes), except that "file not found" is not considered an error. #1343
    • Added a compiler bug workaround to construct_at(), allowing immovable objects to be emplaced via copy elision. #2624
    • Fixed leap second validation when parsing time_points. #2705
    • lerp() now avoids overflowing to infinity when it can calculate the correct result with a fallback approach. #1918
    • Fixed a debugger visualization issue, specific to Clang in C++20 mode (or later), where the debugger wouldn't display the contents of a list, forward_list, or ordered/unordered associative container. #2782
    • Fixed the visualizers for the non-Standard stdext::hash_map container family. #2784
    • Fixed the visualizers for make_shared() and allocate_shared(). #2811
    • put_time() (and the time_put::do_put() machinery powering it) now avoids modifying errno when it succeeds. #2049
    • Added a compiler bug workaround to fix compiler errors with source_location::current() in certain scenarios. #2824
    • Fixed compiler errors when using <format> to print durations with extremely small periods (e.g. femtoseconds, attoseconds). #2814
    • Fixed "istreambuf_iterator is not dereferenceable" assertions when attempting to use time_get::get() or get_time() to parse certain formats when there's insufficient input. #2851
      • For example, with the format "%X", the input "3:04:05" succeeds. The input "3:04" previously asserted/crashed; now it sets ios_base::failbit | ios_base::eofbit as required by the Standard.
    • Removed std::filesystem::directory_entry::clear_cache(), which was a non-Standard extension. #2854
    • Fixed incorrect results from <complex> log()/log10()/pow() on ARM64. #2870
    • Fixed path::lexically_relative() to handle UNC drive paths like \\?\C:\meow.txt. #2867
    • Fixed filesystem::read_symlink() and filesystem::copy() to handle junctions. #2877
    • Fixed compiler errors in ranges::uninitialized_copy_n and ranges::uninitialized_move_n with certain input iterators. #2964
    • Fixed ranges::enable_view to properly reject references and to avoid compiler errors in certain unusual situations. #2978
    • Temporarily disabled ASan (Address Sanitizer) annotations in <string> while significant bugs are under investigation. #2990
    • Fixed compiler errors in views::chunk_by with unusual predicates returning non-bool types. #2890
    • Fixed compiler errors in visit<R>() involving conversions to immovable types. #2971 #2999
    • Fixed compiler errors in chrono::abs() in certain unusual situations. #2988
    • Fixed <format> to always print NaNs as "nan", "-nan", or uppercase versions as required by the Standard, never "-nan(ind)". #3001
    • Fixed ranges::shuffle and ranges::sample to accept uniform_random_bit_generators that don't provide result_type. #3002
    • Fixed vector<bool>::insert(where, first, last) and vector<bool>::insert_range(where, range) to meet the Standard's complexity requirements. #3021
    • Fixed how chunk_view and stride_view iterators validate their preconditions. #3023
    • Fixed a compiler warning emitted by the unusual scenario of basic_string_view<char_like_struct>. #3032
    • Fixed move_only_function to behave correctly when passed between DLLs. #3038
    • Fixed compiler errors when dllexporting classes derived from pair or tuple. #3045
      • This fixed a regression that was introduced by #2687 implementing P2321R2's changes to pair and tuple in VS 2022 17.3.
    • Fixed <regex> integer overflows when parsing huge numbers in backreferences, braced repetitions, and decimal escapes. #2169
      • These will now properly throw regex_errors with codes of error_backref, error_badbrace, and error_escape, respectively.
    • Fixed ranges::distance to follow the Standard, which depicts two overloads (for sized and unsized sentinels). #2987
    • Overhauled how the STL unwraps iterators and sentinels, fixing various issues. #3024
    • basic_string::substr() now uses a default-constructed allocator as required by the Standard. #3057
    • Fixed CUDA compiler errors with std::_Bit_cast by using __builtin_bit_cast instead of a memcpy workaround. #3066
  • Improved performance:
    • Improved clamp() codegen with conditional move instructions. #2336
    • Massively improved iostreams performance for signed char, unsigned char, char8_t, and byte elements, matching the performance of char by avoiding a slow codepath. #2739
    • vector's range constructor, insert(), and assign() now efficiently handle iterators that satisfy the forward_iterator concept, even when their classic iterator_category isn't convertible to forward_iterator_tag. #1794
    • Reduced the size of the lookup tables used for <format> grapheme clusterization, saving 2670 bytes. #2757
    • std::filesystem::path::lexically_relative() now avoids unnecessary memory allocations. #1915
    • Added vectorized implementations of min_element(), max_element(), minmax_element(), ranges::min_element(), ranges::max_element(), and ranges::minmax_element(), with speedups ranging from 1.5x to 26.6x (times, not percent). #2447 #2821 #2825
    • Reduced binary size for programs using atomic::wait. #2781
    • Avoided an unnecessary OS call in thread::join(). #2820
    • VS 2022 doesn't support targeting Windows Vista and Server 2008, but the STL still had runtime branches for those unsupported OSes. We've removed that code to improve performance, notably in mutex::try_lock(). #2317
      • The STL still supports targeting Windows 7 and Server 2008 R2.
    • Removed more unused code for Windows XP/Vista, reducing the size of the STL's DLL by 2 KB, and reducing the number of OS calls during STL startup. #2841
    • Reduced the number of OS calls in filesystem::resize_file() and experimental::filesystem::resize_file(). #2771
    • Improved the optimized codegen for T + complex<T>, T * complex<T>, complex<T> * T, and complex<T> / T. Improved the debug codegen for complex<T> + T and complex<T> - T. #2855
    • Improved the optimized codegen for unreachable(). #3055
  • Improved throughput:
    • Used if constexpr instead of tag dispatch in:
      • get<I>() and get<T>() for pair. #2756
    • optional, pair, and tuple now use conditional explicit instead of SFINAE in all Standard modes, for all supported compilers. #2796
    • The STL now uses "hidden friends" for all operators that are required to exist but aren't required to be namespace-scope functions (e.g. n + vector::iterator). This improves throughput by not polluting unqualified name lookup. #2797
    • <charconv>'s large lookup tables are now separately compiled, so translation units including <charconv> will emit significantly smaller object files. #2125
    • The STL now uses helper function templates for testing bitmask types, replacing a significant number of function overloads. #2865
    • <unordered_map> and <unordered_set> now avoid including most of <string>. #2996
      • This also improves throughput for <functional>, which internally uses <unordered_map> to implement boyer_moore_searcher.
      • Escape hatch: define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS. #3027
    • <functional> now avoids including <memory>. #2998
      • Escape hatch: define _LEGACY_CODE_ASSUMES_FUNCTIONAL_INCLUDES_MEMORY. #3027
  • Enhanced behavior:
    • <tuple> is now a core header. #2730
    • The STL now supports enabling C++20 char8_t in C++14 and C++17 modes via /Zc:char8_t. #2748
    • complex<NonFloating> now emits a deprecation warning explaining that it has unspecified behavior according to the Standard. #2759
    • When wchar_t is a real type, the STL now avoids emitting many specializations for unsigned short that are intended for fake wchar_t only (i.e. the non-Standard /Zc:wchar_t- option). #2164
    • The STL now marks all of its namespace-scope constexpr variables as inline in C++17-and-later mode. #2792
      • This consistency improvement will also avoid emitting a new compiler warning that MSVC is implementing for C++20 header units: "warning C5260: the constant variable 'std::_Meow' has internal linkage in an included header file context, but external linkage in imported header unit context; consider declaring it 'inline' as well if it will be shared across translation units, or 'static' to express intent to use it local to this translation unit".
    • constexpr basic_string now uses the Small String Optimization. #1735
    • error_codes with 0 values and future_category or iostream_category now return "success" from message(), matching the behavior of generic_category. #2742
    • <system_error> now maps: #2744 #2899
      • WAIT_TIMEOUT, ERROR_TIMEOUT, and ERROR_SEM_TIMEOUT to errc::timed_out
      • ERROR_BAD_NET_NAME to errc::no_such_file_or_directory
      • ERROR_FILENAME_EXCED_RANGE to errc::filename_too_long
    • Added visualizers for unique_ptrs and vectors storing character sequences. #2843
    • Added more visualizers for <any>, <format>, <functional>, <mutex>, and <ranges>. #2191
    • <cstdlib> now makes its using-declarations for std::getenv() and std::system() available to UWP apps. #2850
    • <filesystem> and <experimental/filesystem> now use GetTempPath2W() when it's available on Windows 11. #2302
      • This is a security improvement for processes running as SYSTEM; there's no behavioral change for ordinary processes.
      • Follow-up: Fixed linker errors involving _Init_locks::operator= in unusual situations. #3011
    • Added a couple of warning numbers for easier lookup: #2061
      • STL4038 warns "The contents of <meow> are available only with C++NN or later."
      • STL4039 warns "The contents of <coroutine> are not available with /await."
    • <unordered_map> and <unordered_set> no longer provide a non-Standard hash_compare class template in namespace std. #2996
    • Improved how STL error messages (like "Unexpected compiler version") are displayed. #2897
    • Further improved how STL warnings and errors are displayed. #2973
    • Added explanations to the STL's [[nodiscard]] warnings, when the compiler supports [[nodiscard("message")]] and the reason is more complex than the common/simple scenario of pure observers. #2211
      • For example, discarding the return value of std::remove_if() now emits a detailed warning message, explaining the classic erase-remove idiom, and suggesting C++20 std::erase_if() instead.
    • vector::assign(num, val) and std::swap_ranges() now have debug checks for forbidden aliasing. #1263
    • Strengthened exception specifications on:
      • Iterator machinery. #1347 #2991
      • <optional> and the classic comparison function objects (less<T>, equal_to<T>, etc.). #1937 #3041
    • Added support for defining _ENFORCE_ONLY_CORE_HEADERS, limiting STL usage to the subset of core headers. #2068
    • Updated the STL's internal 128-bit integer-class types for C++14/17 compatibility, which will be useful for future performance work. #3036
  • Improved test coverage:
    • Enabled tests now that Clang 14 supports <coroutine>. #2861
    • Slightly accelerated test runs by running memory leak tests with only debug configurations (where memory leak tracking is available). #2853
    • Fixed a test that failed at runtime on ARM64. #2864
    • Added /permissive configurations to tests that can successfully compile in this discouraged-but-supported mode. #3015
    • Taught VSCode's Python extension where to find our test support machinery. #3040
    • Updated the <source_location> test for an upcoming compiler fix. #3046
    • Added test coverage for a <string> bug (specific to ASan annotations being enabled) that was fixed. #3039
  • Code cleanups:
    • Removed compiler bug workarounds. #2791 #2861
    • Various cleanups (described in detail in the PRs, not repeated here). #2798 #2801 #2802 #2815 #2766 #2828 #2863 #2950 #3019
    • Removed visualizers for VS 2013's binary-incompatible representations of various data structures. #2804
    • Simplified tuple_cat()'s implementation. #2833
    • Improved how <system_error> maps Windows error codes to errc values. #2837
    • Refactored <atomic> to share code with C11 atomics (work in progress). #2846
    • Updated most files (with limited exceptions) to consistently include the <cmeow> wrapper headers instead of the <meow.h> CRT headers. #2852
    • Simplified <random>'s static constexpr data members. #3006
    • Finished changing all aliases from typedef to using. #3018
    • Cleaned up several tests to avoid unnecessary dependencies on macros and non-Standard code. #3034
    • Updated <functional> and <memory> to consistently use modern int = 0 SFINAE. #2124
    • Cleaned up feature-test macro usage to be simpler and more consistent. #3053
  • Improved documentation:
    • Added a comment explaining why basic_string doesn't use templated static constexpr data members as internal helpers. #2980
  • Infrastructure improvements:
    • Eliminated duplicate builds of the "alias objects". #2743
    • Fixed distributed test runs to split up the test suite deterministically, avoiding missed or repeated tests. #2795
    • Properly applied /analyze to PR/CI builds, and fixed warnings in the STL's separately compiled sources. #2812
    • Fixed cross-PR/CI contamination by cleaning both before and after checkout. #2832
    • Fixed cross-PR/CI contamination by ignoring submodules during code format validation. #3033
    • Added support for writing benchmarks with google/benchmark. #2780
    • The PR/CI system now uses "1ES Hosted Pools". #3054
    • Updated dependencies. #2754 #2791 #2831 #2861 #3017
      • Updated build compiler to VS 2022 17.4 Preview 1 (now required).
      • Updated Clang to 14.0.5 (now required).
      • Updated CMake to 3.23 (now required).
      • Updated Ninja to 1.11.0.
      • Updated Python to 3.10.6.
      • Updated CUDA to 11.6.0 (now required).
  • Updated _MSVC_STL_UPDATE. #2764 #2840 #3020

VS 2022 17.3

  • Merged C++23 features:
  • Merged partial C++23 features:
    • P2321R2 zip:
      • Changes to tuple, pair, and vector<bool>::reference. #2687
  • Merged LWG issue resolutions:
    • LWG-3121 #2640 tuple constructor constraints for UTypes&&... overloads
    • LWG-3525 #2639 uses_allocator_construction_args fails to handle types convertible to pair
    • LWG-3570 #2418 basic_osyncstream::emit should be an unformatted output function
    • LWG-3571 #2418 flush_emit should set badbit if the emit call fails
  • Merged proposed resolutions for LWG issues (not yet accepted for the C++ Working Draft, but we've chosen to implement this speculatively):
    • LWG-3234 #2703 Sufficient Additional Special Math Overloads
    • LWG-3627 #2607 Inconsistent specifications for std::make_optional overloads
  • Fixed bugs:
    • Fixed vector<bool> to properly invalidate iterators during reallocation, which fixes compiler errors with constexpr usage of vector<bool>. #2441
    • empty_view rvalues are now considered borrowed_ranges as required by the Standard. #2576
    • Added compiler bug workarounds to is_convertible and common_reference, so contiguous_iterator<const volatile int*> is now true. #2592
    • Added missing constraints to functions that were implied by "Effects: Equivalent to" Standardese: make_any(), make_optional(), shared_ptr::operator=(), shared_ptr::reset(), and weak_ptr::operator=().
    • Fixed filesystem::path's comparison operators and some other member functions being IF-NDR (ill-formed, no diagnostic required) in C++23 mode. #2457
      • This fixed a regression that was introduced by #2000 implementing P1989R2 Range Constructor For string_view in VS 2022 17.0.
    • Fixed C++20 <chrono> parsing to fail when the input is insufficient to supply the entire format string. #2523
      • For example, the input "23:59" is insufficient for the format string "%H:%M:%S".
    • Fixed an out-of-bounds read in ranges::find() with unreachable_sentinel. #2434
    • Added compiler bug workarounds for CUDA (involving [[nodiscard]] friend) to fix spurious cases of "warning C5240: 'nodiscard': attribute is ignored in this syntactic position". #2622
    • Removed ExecutionPolicy overloads of copy_backward() and move_backward() that were mistakenly implemented. They don't appear in the Standard because they would be useless. #2627
    • Added compiler bug workarounds for Clang (involving the ordering of constrained and unconstrained destructors) to fix compiler errors in <ranges> machinery. #2630
    • Fixed a bug affecting <future>'s use of <ppltasks.h> in Desktop XAML apps. #2654
    • Fixed a bug that prevented C++20 <chrono> from parsing fractional seconds as floating-point durations. #2638
    • Fixed <bit>'s countl_zero() returning incorrect results on ARM64 for 8-bit and 16-bit types. #2647
    • Added macroization guards to the STL's usage of compiler-specific custom attributes. #2649
    • Fixed get_time() and time_get's 2-digit year logic. #2666
    • Fixed system_category().message() to behave correctly instead of returning "???" when the user language and system language are different. #2669
    • Fixed the ARM64EC implementations of atomic_thread_fence() and atomic<8-byte type>::store(). #2702
    • Fixed compiler errors in atomic<shared_ptr<T[]>>, atomic<shared_ptr<T[N]>>, atomic<weak_ptr<T[]>>, and atomic<weak_ptr<T[N]>>. #1339
    • Added overloads of <cmath>'s lerp() for arithmetic types. #2113
    • Fixed filesystem::directory_entry to work with FAT32 and exFAT. #2373
    • <filesystem> now handles special system files like hiberfil.sys. #2715
    • filesystem::copy_file() now tolerates other processes having opened the source file or the target file for reading or writing (as much as possible, depending on the choice of copy_options). #2718
    • Fixed the visualizers for shared_ptr<void>, weak_ptr<void>, and unique_ptr<void, Deleter>. #2706
    • Fixed compiler errors in move_only_function when compiling <functional> in /std:c++latest mode with /Zc:alignedNew-. #2712
    • Implemented C++20's removal of the explicit specialization for allocator<void>. #2726
      • Note that allocator<void> is still supported, it just uses the primary template now.
    • Fixed "unresolved external symbol" linker errors in certain scenarios involving separately compiled third-party libraries. #2734 #2738
      • On x64, these errors mentioned __imp___std_init_once_begin_initialize and __imp___std_init_once_complete.
      • On x86, these errors mentioned __imp____std_init_once_begin_initialize@16 and __imp____std_init_once_complete@12.
      • This fixed a regression that was introduced by #2381 in VS 2022 17.2.
      • This fix was backported to VS 2022 17.2.5.
  • Improved performance:
    • Optimized rotl() and rotr() in <bit> for 8-bit and 16-bit integers by using compiler intrinsics. #2611
    • Optimized the vectorized implementation of reverse() for 32-bit trivial types. #2383
    • Improved <format> performance when the execution character set isn't self-synchronizing, by caching expensive calls to get codepage info. #2600
    • Added vectorized implementations of find(), count(), ranges::find(), and ranges::count(), with speedups ranging from 2.0x to 27.6x (times, not percent). #2434
    • Slightly improved the performance of <charconv> floating-point from_chars(). #2623
  • Improved throughput:
    • Used if constexpr instead of tag dispatch, overloads, or specializations in:
      • is_permutation(), sample(), rethrow_if_nested(), and default_searcher. #2219
      • <map> and <set>'s common machinery. #2287
      • polymorphic_allocator. #2471
      • basic_string_view and basic_string's find_first_of(), find_last_of(), find_first_not_of(), and find_last_not_of(). #2479 #2660
      • <regex>. #2484
      • Parallel inclusive_scan() and transform_inclusive_scan(). #2662
      • scoped_allocator_adaptor's operator==(). #2677
      • function, move_only_function, and bind(). #2668
      • vector<bool>::insert(). #2694
    • Replaced tag dispatch with SFINAE in subtract_with_carry_engine's internal machinery. #2693
    • Split <chrono> into a smaller internal header, improving throughput when other headers need only pre-C++20 <chrono> machinery. #2604
  • Enhanced behavior:
    • Changed <deque> to use scope guards instead of throw;, making debugging easier when exceptions are thrown. #2308
    • Merged an MSVC-specific attribute, allowing the compiler to improve its handling of constexpr dynamic allocation and constexpr unique_ptr. #2658
    • Implemented <format> grapheme clusterization when determining the width of a string for padding and alignment purposes. This is a "quality of implementation" feature recommended by N4910 [format.string.std]/11. #2119
    • Changed <strstream> to deprecate its classes instead of the entire header. #2680
    • C++98's unexpected() in <exception> was removed by C++17. As with almost all removals, we support an escape hatch to restore unexpected(), by defining _HAS_UNEXPECTED to 1. However, this escape hatch conflicts with C++23, which is reusing the identifier for unexpected<E> in <expected>. Therefore, the escape hatch is now blocked with an #error in C++23 mode. #2709
    • Added ASan (Address Sanitizer) annotations to <string>, allowing additional errors to be detected. #2196
    • <ciso646> now emits a warning in C++20 mode, as it was removed in that Standard. #2710
    • Temporarily disabled join_view for non-forward_ranges until LWG-3698 is resolved. #2727
    • <random> distributions now have non-const function call operators, making it easier to write portable code. #2732
  • Improved documentation:
    • Added comments to the test suite citing GitHub issues and LWG issues. #2433
    • Expanded a comment about the build system's use of /Os. #2708
  • Improved test coverage:
    • Dramatically improved the compiler memory consumption and compile time of two ranges algorithm tests. #2657
    • Removed /Za test coverage. #2714
  • Code cleanups:
    • Removed compiler bug workarounds. #2611
    • Various cleanups (described in detail in the PRs, not repeated here). #2595 #2621 #2656 #2673 #2674 #2675 #2676 #2678 #2679 #2686
    • Simplified the preprocessor logic in <stdatomic.h> for non-compiler tools. #2615
    • Removed test workarounds now that VCRuntime properly recognizes Clang's /std:c++20 and /std:c++latest modes. #2637
  • Infrastructure improvements:
    • Fixed the build system to avoid relinking any DLLs when rerunning CMake and Ninja with no other changes. #2606
    • Added format and validate targets to CMake, so it can run clang-format in parallel, and improved how Azure Pipelines runs the Code Format Validation check. #2671 #2697
    • Updated dependencies. #2611 #2651 #2714
      • Updated build compiler to VS 2022 17.3 Preview 1 (17.2 is now required).
      • Updated to Windows 11 SDK 22000. This is now required for building and testing the STL, but not for using it. #2729
      • Updated Python to 3.10.4.
  • Updated _MSVC_STL_UPDATE. #2634 #2696

VS 2022 17.2

  • Merged C++20 Defect Reports:
    • P2216R3 #2221 std::format Improvements
    • P2418R2 #2323 Add Support For std::generator-like Types To std::format
    • With a final bit of work to implement an integer-class type (per P1522R1) for iota_view, declare <ranges> and <format> stable and make them fully available under /std:c++20. #2518
  • Merged C++23 features:
  • Merged LWG issue resolutions:
    • LWG-2762 #2376 unique_ptr operator*() should be noexcept
    • LWG-2774 #2098 std::function construction vs assignment
    • LWG-3146 #2409 Excessive unwrapping in std::ref/cref
    • LWG-3392 #2421 ranges::distance() cannot be used on a move-only iterator with a sized sentinel
    • LWG-3470 #2414 convertible-to-non-slicing seems to reject valid case
    • LWG-3471 #2567 polymorphic_allocator::allocate does not satisfy Cpp17Allocator requirements
    • LWG-3480 #2340 directory_iterator and recursive_directory_iterator are not C++20 ranges
    • LWG-3519 #2208 Incomplete synopses for <random> classes
    • LWG-3543 #2424 Definition of when counted_iterators refer to the same sequence isn't quite right
    • LWG-3557 #2406 The static_cast expression in convertible_to has the wrong operand
    • LWG-3563 #2426 keys_view example is broken
    • LWG-3574 #2410 common_iterator should be completely constexpr-able
    • LWG-3580 #2417 iota_view's iterator's binary operator+ should be improved
    • LWG-3589 #2425 The const lvalue reference overload of get for subrange does not constrain I to be copyable when N == 0
    • LWG-3590 #2404 split_view::base() const & is overconstrained
    • LWG-3591 #2411 lazy_split_view<input_view>::inner-iterator::base() && invalidates outer iterators
    • LWG-3592 #2411 lazy_split_view needs to check the simpleness of Pattern
    • LWG-3593 #2448 Several iterators' base() const & and lazy_split_view::outer-iterator::value_type::end() missing noexcept
    • LWG-3595 #2410 Exposition-only classes proxy and postfix-proxy for common_iterator should be fully constexpr
    • LWG-3598 #2560 system_category().default_error_condition(0) is underspecified
    • LWG-3610 #2542 iota_view::size sometimes rejects integer-class types
    • LWG-3612 #2586 Inconsistent pointer alignment in std::format
    • LWG-3618 #2566 Unnecessary iter_move for transform_view::iterator
    • LWG-3621 #2543 Remove feature-test macro __cpp_lib_monadic_optional
    • LWG-3648 #2587 format should not print bool with 'c'
    • LWG-3654 #2528 basic_format_context::arg(size_t) should be noexcept
    • LWG-3657 #2564 std::hash<std::filesystem::path> is not enabled
    • LWG-3660 #2549 iterator_traits<common_iterator>::pointer should conform to [iterator.traits]
    • LWG-3661 #2544 constinit atomic<shared_ptr<T>> a(nullptr); should work
  • Merged proposed resolutions for LWG issues (not yet accepted for the C++ Working Draft, but we've chosen to implement this speculatively):
  • Fixed bugs:
    • Fixed Clang compiler errors when using ranges::join_view. #2352
    • Fixed several runtime correctness bugs in std::string. #2305
    • Fixed a memory leak affecting a specific scenario in P0408R7 Efficient Access To basic_stringbuf's Buffer. #2361
    • Each call to ranges::clamp now correctly performs at most three projections. #1898
    • The STL no longer rejects Clang in CUDA mode, nor the cl /showIncludes /D__CUDACC__ ... command used by CUDA's msbuild integration to gather dependencies. #2075
    • Fixed allocator::is_always_equal to be deprecated, not removed, in C++20 mode. (It was deprecated by LWG-3170.) #2423
    • Fixed begin()/end() crashing for empty valarrays, which also affected range-based for-loops. #2435
    • Fixed regression in ranges::distance (from LWG-3392 which broke ranges::distance(some_array, s)) by speculatively implementing LWG-3664. #2522
    • Fixed basic_string::resize_and_overwrite() to no longer emit "warning C4018: signed/unsigned mismatch" when given certain user-defined function objects. #2525
    • Increased __cpp_lib_concepts to its final value for C++20, 202002L. #2559
      • It should have been updated in VS 2019 16.6 when P1964R2 "Replacing boolean With boolean-testable" was implemented by #565. The presence of that release (or any later release) can be detected by inspecting our implementation-specific macro _MSVC_STL_UPDATE. Coincidentally, the value of _MSVC_STL_UPDATE for VS 2019 16.6 was also 202002L.
    • Fixed numerous tiny bugs discovered by the libcxx test suite. #2499
    • Fixed a bug in <format> that sporadically caused incorrect output when formatting floating-point values in hex or scientific notation with extremely large precisions. #2569
    • Fixed a bug in <charconv> from_chars() float tiebreaking that produced incorrect results. This affected decimal strings that were at the exact midpoint of consecutive float values, within a narrow range (the smallest and largest affected values were "32768.009765625" and "131071.98828125"), where the tiebreaker rule wanted to round to "even" and "even" happened to be "down", but the implementation incorrectly rounded "up". (double was unaffected.) #2366
    • promise<T> now compiles when !is_default_constructible_v<T>. #2568
    • Moving from an optional<const T> now behaves like moving from a const T: it selects T's copy constructor. #2460
    • Fixed a bug in <format> that incorrectly accepted volatile arguments; the Standard currently says that they should be rejected. #2579
  • Improved performance:
    • Optimized rotl() and rotr() in <bit> for 32-bit and 64-bit integers by using compiler intrinsics. #2369
    • reverse_copy()'s vectorized implementation is now activated (for eligible types) in all Standard modes. Previously, only the C++14/17 modes activated this optimization; C++20/23 modes unintentionally used the plain implementation (correct but slower). #2416
    • Improved codegen for gcd() and lcm(). #2343
    • Improved <format> performance when the execution character set is self-synchronizing. For example, code page 1252 "ANSI Latin 1; Western European (Windows)" activates this optimization. The /utf-8 compiler option also activates this optimization. #2493
    • Improved codegen for generate_canonical. #2498
  • Improved throughput:
    • Used if constexpr instead of tag dispatch in:
      • Optimizations in find(). #2380
      • experimental::filesystem::directory_iterator. #2478
      • basic_string(first, last). #2480
  • Enhanced behavior:
    • Fixed new warnings emitted by Clang 13: -Wdeprecated-copy (in product and test code) and -Wunused-but-set-variable (in test code only). #2266
    • Added ASan (Address Sanitizer) annotations to <vector>, allowing additional errors to be detected. #2071 #2420 #2464 #2508
    • Added a debug assertion to allocator::deallocate(); passing a null pointer with a non-zero size is an error. #2412
    • For supply chain security, replaced checked-in OBJ files (generated by an internal tool aliasobj) with the linker's /ALTERNATENAME option (which is strictly more reproducible, although not officially documented). #2381
      • In certain scenarios involving separately compiled third-party libraries, this can cause "unresolved external symbol" linker errors. See issue #2655 for an explanation and workarounds.
  • Improved documentation:
    • Clarified the messages emitted by <format> and <ranges>. #2382
    • Added a comment explaining how LWG-3632 "unique_ptr 'Mandates: This constructor is not selected by class template argument deduction'" was already implemented. #2548
  • Improved test coverage:
    • Added test cases for the _BitScanForward optimization used by countr_zero() on older CPUs. #2337
    • Added tests for gcd() and lcm(). #2507
    • Added test coverage for deduplicated (topologically sorted) header units. #2516 #2563
    • Updated the libcxx test suite. #2499
  • Code cleanups:
    • Removed compiler bug workarounds. #2338 #2351 #2357 #2474 #2496
    • Updated test code to directly pass a format string to printf(), allowing the compiler to check it. #2346
    • Cleaned up clang-formatting. #2356
    • Changed the <charconv> test headers to use include guards, for closer alignment with libc++. #2372
    • Improved the clarity of vectorized algorithm implementations by replacing the magic numbers 27 and 78. #2377
    • Improved consistency by always saying friend constexpr instead of the reverse order. #2419
    • Simplified <ratio>'s implementation by using constexpr functions instead of template metaprogramming. #2450
    • Simplified an internal function for opening files. #2095
  • Infrastructure improvements:
    • Updated dependencies. #2474 #2496 #2514
      • Updated build compiler to VS 2022 17.1 Preview 5 (now required).
      • Updated Clang to 13.0.0 (now required).
      • Updated CMake to 3.22 (now required).
      • Updated Python to 3.10.2.
    • Added scripts to set INCLUDE, LIB, and PATH after building the repo. #2578
    • Azure Pipelines now uploads test logs as artifacts, making it easier to investigate test failures when lengthy command lines, compiler output, or runtime output are truncated in the web UI. #2575
  • Updated _MSVC_STL_UPDATE. #2374 #2455 #2519 #2602

VS 2022 17.1

  • Merged C++20 Defect Reports:
  • Merged C++23 features:
  • Merged LWG issue resolutions:
    • P2259R1 #2059 Repairing Input Range Adaptors And counted_iterator
      • Completed by implementing the input range adaptors part.
    • LWG-3422 #2260 Issues of seed_seq's constructors
    • LWG-3506 #1994 Missing allocator-extended constructors for priority_queue
    • LWG-3520 #2200 iter_move and iter_swap are inconsistent for transform_view::iterator
    • LWG-3522 #1994 Missing requirement on InputIterator template parameter for priority_queue constructors
    • LWG-3527 #2194 uses_allocator_construction_args handles rvalue pairs of rvalue references incorrectly
    • LWG-3528 #2160 make_from_tuple can perform (the equivalent of) a C-style cast
    • LWG-3536 #2037 Should chrono::from_stream() assign zero to duration for failure?
    • LWG-3546 #1991 common_iterator's postfix-proxy is not quite right
    • LWG-3549 #2198 view_interface is overspecified to derive from view_base
    • LWG-3554 #2261 chrono::parse needs const charT* overloads
  • Fixed bugs:
    • Fixed <complex> exp() and polar() for infinity and NaN inputs. #1584
    • Fixed compiler errors when comparing common_iterators of different types for equality. #2066
    • Attempting to actually call declval() now emits a static_assert citing the paragraph of the Standard that forbids this. (Previously, declval() was declared but not defined, which was too permissive.) #2101
    • Fixed basic_streambuf::seekoff() and basic_streambuf::seekpos() to work with custom pos_types. #2121
    • Restored our guarantee beyond the Standard that string_view is trivially move constructible. #2128
      • This fixed a regression that was introduced by #2000 implementing P1989R2 Range Constructor For string_view in VS 2022 17.0.
    • Fixed a bug where vector and string would terminate via noexcept instead of throwing length_error as desired when a size_t would be truncated to an allocator's narrower size_type. #2139
    • <istream> and <ostream> now properly catch and rethrow internal IO exceptions. #2033
    • Fixed <format> to correctly print hexfloats with large precisions. #2157
    • Fixed compiler errors when using constexpr vectors with certain user-defined allocators. #2161
    • Fixed silent bad codegen in ranges::stable_sort(), where for certain inputs it would neither sort nor permute the range. ranges::inplace_merge() was also affected. #2188
    • subtract_with_carry_engine's textual representation is now correct. #2088
    • Fixed a deadlock in the overload of condition_variable_any::wait_until taking stop_token. #2220
    • u8streampos, u16streampos, and u32streampos are now declared by <iosfwd> as required by the Standard after P0482R6 and P1148R0 were accepted. #2223
    • Fixed ARM64EC compiler errors in <limits>. #2306
    • Fixed heap corruption in fstream when calling putback() followed by close(). #2189
    • Fixed views::reverse to work properly with ranges::reverse_view lvalues. #2313
    • Fixed a bug where the STL's DLL was using Windows Vista's APIs for critical sections and condition variables, instead of the more efficient APIs that were introduced in Windows 7. This was specific to /MD (dynamic release) and the STL's GitHub CMake build system; it did not affect the legacy build system that's currently used for official builds of the MSVC toolset. #2314
    • Fixed a bug affecting older CPUs where the STL generated the newer tzcnt instruction instead of the fallback bsf instruction. This affected <bit>'s countr_zero() and countr_one(), <numeric>'s gcd() and lcm(), and vector<bool>'s optimized implementations of find() and relational/spaceship operators. #2333
    • Fixed minor conformance issues in basic_string. These changes were specified by P1148R0 "Cleaning Up [strings]", which was almost a pure rewording paper without normative impact. Oops! #2222
    • Fixed ranges::find_end() to return correct values for bidirectional common ranges. #2270
    • Fixed compiler errors affecting ranges::sort(), ranges::search(), and other ranges machinery. #2290
    • Fixed array<T, 0>, allowing it to compile when T is not default constructible. #2296
    • Fixed allocator::allocate_at_least() which was improperly annotated with __declspec(allocator). #2328
  • Improved performance:
    • Optimized steady_clock::now() when QueryPerformanceFrequency() is exactly 10 MHz, which is very common for modern PCs. #2086
    • Improved codegen for x86 atomic loads. #2110
    • Optimized the fallback implementation of popcount(), which is used when compiler intrinsics are unavailable (and is also used at compile time). #2079
    • Slightly improved codegen when <format> prints a pointer in hexadecimal. #2097
    • Optimized <ranges> non-propagating-cache for trivially destructible types. #2118
    • Improved ARM64 codegen for popcount(), using compiler intrinsics. #2127
    • Extended the memcpy(), memmove(), and memcmp() optimizations in various algorithms to handle more types. #2158
    • Significantly improved the performance of bitset::count() by using the same machinery as popcount(). #2201
    • Also improved the performance of std::count() for vector<bool> by using popcount() machinery in a more optimizer-friendly way. #2203
    • weak_ptr's converting constructors now avoid locking except when necessary to ensure correctness in virtual inheritance scenarios. #2282
      • For example, converting weak_ptr<T> to weak_ptr<const T> now avoids locking.
    • Removed a duplicated assignment in filesystem::create_directories(). #2304
    • Optimized is_permutation() for reversed sequences. #2043
  • Improved throughput:
    • Replaced tag dispatch with if constexpr in container copy/move assignment. #2217
    • <format> now avoids instantiating vformat() unless and until it's called. #2331
  • Enhanced behavior:
    • Changed numeric_limits<long double>::max_digits10 to handle both 64-bit and 80-bit long double, by restoring the original logic that was used before VS 2017 15.8.
      • Note: 80-bit long double remains unsupported by MSVC.
    • C++ headers now emit clear #error messages when they're compiled as C. #2148
      • This applies to both the "C++ library headers" like <vector> and the "C++ headers for C library facilities" like <cstdio>.
    • Improved the wording of binary_semaphore's debug check messages. #2293
  • Improved documentation:
    • Cited LWG-3581 "The range constructor makes basic_string_view not trivially move constructible" in our implementation of its proposed resolution. #2175
    • Removed comments that were citing GH-489, now that LWG-3530 "BUILTIN-PTR-MEOW should not opt the type out of syntactic checks" has been officially resolved by the June 2021 virtual plenary meeting. #2186
  • Improved test coverage:
    • Removed a constructible_from test case that was invalidated by recent changes to the Core Language. #2107
    • Fixed a test for next_permutation() and prev_permutation(); the algorithms were fine, but the test never worked and was never called. #2137
    • Fixed the test harness to handle non-English Visual Studio installations running on Windows with non-UTF-8 encodings. #2145
    • Added /arch:AVX2 to the matrix of compiler options that's used when testing <bit>. #2150
    • Skipped more flaky tests in the legacy tr1 test suite. #2202
    • Fixed flaky tests in the legacy tr1 test suite that were generating collisions between temporary filenames. #2210
    • Fixed test failures on Windows 11. #2265
    • Fixed <chrono> formatting test failures related to locale-dependent time zone abbreviations. #2231
  • Code cleanups:
    • Moved a helper struct from a central internal header to <optional>. #2117
    • Cleaned up comments and clang-formatting. #2136
    • Removed a spurious overload of operator>>(basic_istream&&, basic_string&). This didn't affect correctness, but it was neither necessary nor depicted by the Standard. #2138
    • Cleaned up various things, notably simplifying exception_ptr's operators for C++20 and emitting a clear error message when compiling <stdatomic.h> as C. #2140
    • Removed unnecessary code in <cctype> that was attempting to defend against macroized isalnum etc. #2147
    • Removed an unnecessary reinterpret_cast, and changed some reinterpret_casts from void* to T* to use static_cast instead. #2096
    • Removed an unnecessary definition of our internal macro _HAS_CXX23 from our central internal header yvals_core.h. #2226
    • Removed comments that were citing proposed resolutions for LWG issues, now that those issues have been officially resolved by the October 2021 virtual plenary meeting. #2269
    • Removed unnecessary (void) casts now that MSVC emits fewer spurious warnings about unreferenced parameters. #2280
    • Removed compiler bug workarounds. #2327
  • Infrastructure improvements:
    • Updated dependencies. #2115 #2204 #2277 #2327
      • Updated build compiler to VS 2022 17.1 Preview 1.
      • Updated CMake to 3.21 (now required).
      • Updated Python to 3.10.0.
    • Replaced vcpkg with boostorg/math 1.77 in standalone mode. #2151
  • Updated _MSVC_STL_UPDATE. #2183 #2233 #2321

VS 2022 17.0

  • Merged C++20 Defect Reports:
    • P2325R3 #2012 Views Should Not Be Required To Be Default Constructible
    • P2328R1 #2038 join_view Should Join All views Of ranges
    • P2367R0 #2026 Remove Misuses Of List-Initialization From Clause 24 Ranges
  • Enabled C++20 features for Clang: #2064
  • Merged C++23 features:
    • P0401R6 #2036 Providing Size Feedback In The Allocator Interface
    • P1048R1 #1950 is_scoped_enum
    • P1132R7 #1998 out_ptr(), inout_ptr()
    • P1679R3 #1478 contains() For basic_string/basic_string_view
    • P1682R3 #1828 to_underlying() For Enumerations
    • P1951R1 #2009 Default Template Arguments For pair's Forwarding Constructor
    • P1989R2 #2000 Range Constructor For string_view
    • P2162R2 #2006 Inheriting From variant
    • P2166R1 #1995 Prohibiting basic_string And basic_string_view Construction From nullptr
      • This is a common source-breaking change - code that previously had undefined behavior at runtime will now be rejected with compiler errors.
    • P2186R2 #2010 Removing Garbage Collection Support
  • Merged LWG issue resolutions:
    • LWG-3430 #1968 std::fstream & co. should be constructible from string_view
    • LWG-3494 #1877 Allow ranges to be conditionally borrowed
    • LWG-3502 #1878 elements_view should not be allowed to return dangling references
    • LWG-3518 #2080 Exception requirements on char trait operations unclear
    • LWG-3533 #1993 Make base() const & consistent across iterator wrappers that support input_iterators
    • LWG-3541 #1992 indirectly_readable_traits should be SFINAE-friendly for all types
    • LWG-3548 #2007 shared_ptr construction from unique_ptr should move (not copy) the deleter
    • LWG-3553 #1990 Useless constraint in split_view::outer-iterator::value_type::begin()
    • LWG-3555 #1989 {transform,elements}_view::iterator::iterator_concept should consider const-qualification of the underlying range
  • Merged partial LWG issue resolutions:
    • P2259R1 #1939 Repairing Input Range Adaptors And counted_iterator
      • The counted_iterator part is implemented; the input range adaptors part is not yet implemented.
  • Fixed bugs:
    • Fixed time_put::do_put to avoid crashing when the invalid parameter handler has been changed to not end execution. #1563
    • Fixed a compiler error in ranges::take_view. #1844
    • Fixed improper partitioning of forward ranges in the parallel algorithms. #1753
    • Fixed an unintentionally dllexported symbol in the import library. #1927
    • Fixed a bug in which ranges::unique_copy would fail to compile with a non-input output iterator. #1933
    • Fixed a compiler error when calling format_to() in a specialization of formatter (see #1961 for an example). #1874
    • Fixed compiler errors when calling views::drop and views::take with types that aren't integers, but are convertible to integers (e.g. integral_constant). #1958
    • Fixed a compiler error when calling constexpr vector::emplace(position, args...). #1962
    • Fixed jthread to provide native_handle(). #1966
    • Fixed filesystem::remove() to delete read-only files, as required by the Standard. #1559
    • Fixed mersenne_twister_engine: #1631
      • Fixed the seeding algorithm to follow N4892 [rand.eng.mers]/8, avoiding an all-zero state. (This is a runtime special case.)
      • Fixed the engine's behavior when m == n or n == 1. (This is a compile-time special case, which doesn't affect mt19937 and mt19937_64 at all.)
      • Fixed operator<<() to avoid printing a trailing space after the engine's textual representation.
    • Fixed <chrono> to adjust for leap seconds when formatting file_time. #1879
    • Fixed chrono::from_stream() to allow a year and a day-of-year to be parsed to a time_point. #1940
    • Fixed filesystem::u8path() to accept char8_t sources. #1943
    • Fixed <chrono> to parse subseconds for time_points. #1987
      • Also fixed the parsing of local_time with a UTC offset.
    • Fixed <chrono> formatting to correctly estimate string widths (see N4892 [format.string.std]/9). #2017
    • Fixed a major regression in the _ITERATOR_DEBUG_LEVEL == 2 machinery, where a multithreaded program in debug mode could crash when one thread is modifying a container and another thread is destroying iterators. #2060
      • This regression affected all Standard modes (C++14/17/20/23) and was introduced by #1546 in VS 2019 16.10.
      • Fixed in both VS 2019 16.11.4 and VS 2022 17.0.
    • Fixed a compiler error in pmr::map<K, pair<A, B>>::operator[]. #2023
    • Fixed compiler errors in basic_string's getline() and operator>>() caused by the source-breaking change C++23 P2266R1 "Simpler Implicit Move", first implemented in Clang 13. #2025
    • bit_ceil() now enforces its precondition during constexpr evaluation, as required by the Standard. #2041
    • clog is no longer tied to cout, and similarly for wclog and wcout, following the Standard. #2056
    • In <ranges>, when filter_view, drop_view, drop_while_view, and reverse_view store a cached position into an underlying view, they now properly invalidate that cached position when the underlying view is moved from. #1931
  • Improved performance:
    • Slightly improved debug codegen for vector<bool>, basic_string, and map/multimap/set/multiset's empty() member functions. #1836
    • Fixed bloated codegen for <format>. #1874
    • Dramatically improved the performance of std::find() and std::count() for vector<bool>, with measured speedups between 19x and 26x (times, not percent). #1131
    • Extended our memcmp/memcpy/memchr optimizations to ranges with contiguous iterators and unreachable sentinels. #1810
    • <format> now detects when it's writing to a back_insert_iterator for a basic_string or a vector, and performs a faster call to insert() at the end() of the container. #1894
    • std::byte now activates the "trivially swappable" optimization in reverse() and variant::swap(), so it'll have the same performance as unsigned char. #2044
    • Extended the vectorization optimization in std::swap_ranges() to ranges::swap_ranges(), and enhanced it to work for arbitrary contiguous iterators. #2048
    • Reduced debug codegen size; an internal assertion macro was emitting completely unused, potentially long strings for function names. #2054
  • Improved throughput:
    • <format> and <chrono> now avoid including <array>. #2031
  • Enhanced behavior:
    • Added a visualizer for source_location. #1837
    • Added [[nodiscard]] to the stoi() family of functions in <string> and to various functions in <locale> (collate member functions, has_facet(), and the isalnum() and tolower() families). #1809
    • Added a debug mode precondition check to forward_list::splice_after(). #2057
    • Added visualizers for bind_front(), u8string (and its iterators), default_sentinel_t, unreachable_sentinel_t, ranges::empty_view, ranges::single_view, ranges::iota_view (and its iterator/sentinel), ranges::ref_view, thread, thread::id, jthread, and filesystem::path. #1856
  • Improved test coverage:
    • Added test coverage for our implementation-specific guarantees that span and basic_string_view are trivially copyable; P2251 may eventually Standardize these guarantees. #2015
    • Fixed the ranges test machinery to properly specialize std::basic_common_reference; it was unintentionally relying on identical bugs in MSVC and Clang, but EDG correctly diagnosed that the code was non-Standard. #2013
    • Fixed a test (for the abs() overloads in <cmath> and <cstdlib>) that unintentionally hadn't been running in our new GitHub test harness. #2070
  • Code cleanups:
    • Removed compiler bug workarounds. #1759 #1778 #1920
    • Removed unnecessary C casts. #1843
    • The STL now uses Standard _Pragma instead of non-Standard __pragma (when possible) to internally suppress warnings. #1342
    • <format> now uses _First/_Last parameter names (instead of _Begin/_End) to be consistent with the rest of the STL. (The connotations are that first/last refers to an arbitrary range that might be a subrange, while begin/end refers to an entire container/view.) #1951
    • Removed comments that were citing proposed resolutions for LWG issues, now that those issues have been officially resolved by the June 2021 virtual plenary meeting. #1967
    • Improved vector's implementation, also using if constexpr to simplify code. #1771
    • Simplified <format>'s implementation of type-erased argument storage. #1907
    • Filed LWG-3566 "Constraint recursion for operator<=>(optional<T>, U)" and updated our implementation's comment accordingly. #2011
    • Simplified the backwards loop in char_traits::move(). #2055
    • Marked all overriding functions with override, and removed redundant virtual keywords. #2069
    • REMOVED THE "SHOUTY COMMENT BANNERS" LIKE // CLASS TEMPLATE vector; SEE #306 FOR THE RATIONALE. #2074
    • Removed an unnecessary check for self-assignment in the compile-time implementation of char_traits::move(). #2083
  • Infrastructure improvements:
    • Updated dependencies. #1884 #1920 #1953 #2014 #2064 #2081
      • Updated build compiler to VS 2022 17.0 Preview 2 (now required).
      • Updated Clang to 12.0.0 (now required).
      • Updated CMake to 3.20 (now required).
      • Updated Python to 3.9.6.
      • Updated vcpkg for Boost 1.76.0 (now required).
  • Build system improvements:
  • Updated _MSVC_STL_UPDATE. Also updated _MSVC_STL_VERSION to 143 for the VS 2022 release series. #1897 #1955 #2035 #2091