Skip to content

Changelog

Stephan T. Lavavej edited this page Feb 11, 2025 · 2245 revisions

Table of Contents

C++23 features generally require the /std:c++23preview or /std:c++latest compiler options.

VC Redist Lockdown

To reduce the frequency of required reboots when updating VS (and VS Previews), we "lock down" the Visual C++ Redistributable containing the STL's msvcp140.dll. (Most of the STL is header-only, so most changes are unaffected.) Approximately twice a year, specific VS Previews will be "unlocked", so the VC Redist will contain updated DLLs. VS 2022 17.14 Preview 1 will be unlocked.

VS 2022 17.14

Expected in VS 2022 17.14 Preview 3

  • Fixed bugs:
    • Fixed how <format> handles field width for alternate form general floating-point. #5261
  • Enhanced behavior:
    • Improved the STL's debug checks with better messages and fewer branches. #5270
  • Improved test coverage:
    • Added test coverage for the ASan annotations in basic_string::reserve() and vector::reserve(). #5241
  • Updated _MSVC_STL_UPDATE. #5264

Expected in VS 2022 17.14 Preview 2

  • Fixed bugs:
    • Fixed integer overflow in this_thread::sleep_for() with extremely small units (e.g. picoseconds). #5237
    • Fixed basic_string::reserve()'s ASan annotations to detect writes to its unused capacity. #5252
  • Code cleanups:
    • Removed compiler bug workarounds. #5247 #5257
    • Removed usage of [[likely]] and [[unlikely]], which are discouraged by the compiler team. #5255
  • Infrastructure improvements:
    • Updated dependencies. #5247 #5257
      • Updated build compiler to VS 2022 17.13 Preview 4.
      • Updated Clang to 19.1.1 (now required).

VS 2022 17.14 Preview 1

  • Merged C++26 features:
    • P3323R1 #5213 Forbid atomic<cv T>, Specify atomic_ref<cv T>
  • Merged LWG issue resolutions:
    • LWG-3133 #5157 Modernizing numeric type requirements
    • LWG-3886 #5232 Monad mo' problems (in optional and expected)
    • LWG-3900 #5150 The allocator_arg_t overloads of generator::promise_type::operator new should not be constrained
    • LWG-3918 #5135 #5170 std::uninitialized_move/_n and guaranteed copy elision
    • LWG-4014 #5132 LWG-3809 changes behavior of some existing std::subtract_with_carry_engine code
    • LWG-4027 #5221 possibly-const-range should prefer returning const R&
    • LWG-4084 #5151 std::fixed ignores std::uppercase
    • LWG-4112 #5152 has-arrow should require operator->() to be const-qualified
    • LWG-4119 #5220 generator::promise_type::yield_value(ranges::elements_of<R, Alloc>)'s nested generator may be ill-formed
    • LWG-4124 #5155 Cannot format zoned_time with resolution coarser than seconds
    • LWG-4135 #5131 The helper lambda of std::erase for list should specify return type as bool
    • LWG-4140 #5129 Useless default constructors for bit reference types
    • LWG-4144 #5201 Disallow unique_ptr<T&, D>
    • LWG-4169 #5128 std::atomic<T>'s default constructor 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-3424 #5232 optional::value_or should never return a cv-qualified type
  • Fixed bugs:
    • Fixed system_category().message() to prefer US English, followed by the system locale, with an ultimate fallback of FormatMessageA's behavior for dwLanguageId == 0. #5104
      • This is consistent with generic_category().message() (which always returns US English in our implementation) and has the best chance of returning something intelligible instead of "unknown error" or "???".
      • This fixed a regression that was introduced by #2669 in VS 2022 17.3.
    • Fixed filesystem::equivalent() to return correct results when shared folders are involved. #5130
    • Fixed chrono::weekday's constructor to avoid integer overflow for extreme inputs. #5156
    • Fixed regex to reject bogus character class ranges like R"([\d-e])". #5158
    • Fixed wregex to correctly handle negated character class escapes (\D for non-digits, \S for non-whitespace, \W for non-words) when matching against Unicode characters. #5160
      • This fix is limited to negated character class escapes outside of square-bracket character classes.
    • Partially fixed wregex's behavior for negated character class escapes inside square-bracket character classes. #5214
    • Fixed multiple regex bugs involving character ranges in case-insensitive mode. #5164
    • Fixed regex's basic grammar to parse a single digit for backreferences. #5167
    • Fixed regex's internal buffers to grow geometrically. #5175
    • Fixed regex's behavior for the special character . (dot). #5192
    • Fixed regex's constructor to accept (null, zero) arguments. #5211
    • Fixed push_range() for stack, queue, and priority_queue to forward the range to c.append_range() when possible, exactly as depicted in the Standard. #5168
    • Fixed code to call ranges::begin and ranges::end exactly as depicted in the Standard:
    • Fixed compiler errors in range_formatter involving highly unusual contiguous ranges. #5187
    • Fixed heterogeneous lookup for unordered containers to follow the Standard, allowing braced initializer lists to be used as arguments. #5208
    • Fixed compiler errors in views::counted involving highly unusual types. #5223
  • Improved performance:
    • Added vectorized implementations of:
      • basic_string::find() for a character. #5101
    • Improved the vectorized implementations of:
      • basic_string::find_first_of() and basic_string::find_last_of(). #5029
    • regex_traits::translate() is now an identity function, as required by the Standard, instead of an expensive locale operation. #5209
  • Enhanced behavior:
    • std::expected, std::unexpected, and all STL exception types are now marked [[nodiscard]]. #5174
      • This affects all user-defined functions returning these types by value. It also affects any directly constructed temporaries that are immediately discarded.
    • Deprecated the non-Standard locale::empty() static member function. #5197
    • Changed the STL to avoid using is_trivial, which is being deprecated in C++26. #5202
  • Improved debugger visualization:
    • Improved the visualizers for basic_string_view and its iterators by suppressing irrelevant pointer values. #5176
    • Dramatically simplified how the visualizers for basic_string and its iterators are implemented. #5177
  • Improved test coverage:
    • Simplified the test harness by dropping ctest. Now we always directly invoke stl-lit.py. #5169
    • Improved the test harness to warn only once when a compiler is missing. #5199
    • Categorized libcxx test failures. #5231
    • Updated our LLVM submodule, including new tests. #5235
  • Code cleanups:
    • Removed compiler bug workarounds. #5186
  • Infrastructure improvements:
    • Updated dependencies. #5186
      • Updated build compiler to VS 2022 17.13 Preview 2.
      • Updated Python to 3.13.1.
      • Updated VMs to compute-optimized F32as_v6.
  • Updated _MSVC_STL_UPDATE. #5162 #5217

VS 2022 17.13

  • Merged C++23 features:
  • Merged C++23 Defect Reports:
    • P3107R5 #4821 Permit An Efficient Implementation Of <print>
      • P3235R3 std::print More Types Faster With Less Memory
  • Fixed bugs:
    • Fixed an infinite loop in deque::shrink_to_fit(). #4955
      • This fixed a regression that was introduced by #4091 in VS 2022 17.10.
    • Fixed compiler errors when constructing highly unusual unique_ptrs (storing fancy pointers) from unspeakably evil relics of the forgotten past. #4922
    • Fixed compiler errors when calling ranges::inplace_merge with certain combinations of elements, projections, and comparisons. #4927
    • Fixed compiler errors in basic_ispanstream's constructor and basic_ispanstream::span() taking ReadOnlyRange&& with highly unusual types. #4938
    • Fixed compiler errors in the highly unusual scenario of calling basic_string and basic_string_view's find_first_of() family of member functions for program-defined "unicorn" character types. #4951
    • Fixed compiler errors when constructing optional from highly unusual types. #4961
    • Fixed sequence container emplacement functions (e.g. vector::emplace_back()) to avoid emitting "warning C5046: Symbol involving type with internal linkage not defined" for highly unusual types. #4963 #4980
      • This also fixed ODR violations when mixing C++14 with C++17-and-later translation units calling sequence container emplacement functions for any types.
    • Fixed ODR violations when mixing C++17 with C++20-and-later translation units calling list/forward_list::remove/remove_if/unique(). #4975
    • Fixed compiler errors in variant's converting constructor and converting assignment operator for certain types. #4966
    • Fixed bitset's streaming operator operator>>(basic_istream<CharT, Traits>&, bitset<N>&) to use the stream's Traits to compare characters. #4970
    • Fixed basic_string and list's internal constructors to avoid disrupting highly unusual scenarios. #4976
    • Fixed compiler errors when constructing a packaged_task from a move-only function object. #4946
    • For Clang /fp:fast, fixed <cmath> and <limits> to avoid emitting -Wnan-infinity-disabled warnings, except when numeric_limits::infinity()/quiet_NaN()/signaling_NaN() are specifically called. #4990
    • Fixed ranges::copy_n to properly handle negative values of n (as a no-op) when activating our memmove() optimization. #5046
      • Also fixed our memmove() optimization (used by copy_n(), ranges::copy_n, and more) to avoid emitting compiler warnings with certain iterators.
    • Fixed filesystem::directory_entry::refresh() to avoid sporadically failing for nonexistent network paths on Windows 11 24H2. #5077
    • Fixed basic_istream::get() and basic_istream::getline() to never write a null terminator into zero-sized buffers, and to always write a null terminator otherwise. #5073
    • Fixed assign_range() for sequence containers to static_assert that the container elements are assignable from the range's reference type. #5086
    • Fixed compiler errors in various ranges algorithms when used with views::iota in certain scenarios. #5091
  • Improved performance:
    • Added vectorized implementations of:
      • basic_string::find_first_of(). #4744
      • basic_string::find_last_of(). #4934
      • basic_string::find() for a substring. #5048
      • basic_string::rfind() for a substring. #5057
      • basic_string::rfind() for a single character. #5087
      • search(), ranges::search, and default_searcher, for 1-byte and 2-byte elements. #4745
      • find_end() and ranges::find_end, for 1-byte and 2-byte elements. #4943 #5041 #5042
      • bitset's constructors from strings. #4839
      • remove() and ranges::remove. #4987
    • Improved the vectorized implementations of:
      • ranges::minmax, now activated for 1-byte and 2-byte elements. #4913
      • The minmax_element() and minmax() algorithm families. #4917 #5016
    • Helped the compiler auto-vectorize:
    • ranges algorithms now unwrap output iterators, avoiding unnecessary checking. #5015 #5027
    • Optimized bitset's streaming operators. #5008
    • Optimized the newline-printing overloads println(FILE*), println(ostream&), and nullary println(). #4672
    • Updated array and vector's spaceship comparison operators to take advantage of the vectorized implementation of lexicographical_compare_three_way(). #5078
    • Extended the "key extraction" optimization in the unique associative containers (both ordered and unordered) to handle more types. #5050
    • Optimized filesystem::symlink_status() by avoiding unnecessary Windows API calls. #5071
  • Improved throughput:
    • Improved C++23 throughput by not including all of <ostream> (which drags in <format>) unless the Standard requires it. #4936
    • Improved C++23 throughput of <queue>, <stack>, <stacktrace>, and <thread> by not including all of <format>. #5003
    • Moved system_clock, high_resolution_clock, and chrono_literals from a commonly-included internal header to <chrono>. #5105
      • This has source-breaking impact. If you see compiler errors complaining that it doesn't recognize chrono types like system_clock or UDLs like 1729ms, you need to include <chrono> specifically, instead of assuming that headers like <thread> will drag it in.
  • Enhanced behavior:
    • Changed an internal pair constructor to be private. #4979
    • Fixed a CodeQL warning by replacing a squirrelly memcpy() call in the filesystem implementation (that was intentionally performing a read overrun) with two cromulent memcpy() calls. #4933
    • Silenced CodeQL warnings. #4942 #4985 #5072
    • Added a visualizer for system_clock::time_point. #5005
    • Changed some vector machinery to use scope guards instead of throw;, making debugging easier when exceptions are thrown. #4977
    • Improved regex_error::what()'s message for regex_constants::error_badbrace. #5025
    • Improved optional<T>::swap()'s static_assert messages when T isn't both move constructible and swappable. #5065
    • Removed locale::id's non-Standard constructor from size_t and implicit conversion operator to size_t. #5067
      • For user-visible headers, at least. They remain dllexported for binary compatibility.
    • Improved mutex assertions to distinguish "unlock of unowned mutex" from "unlock of mutex not owned by the current thread". #5099
  • Improved test coverage:
    • Updated tests to work with Clang 18. #4932 #4937
    • Fixed sporadic failures in a timed_mutex test. #4973
    • Extended CUDA test coverage beyond C++14, adding C++17 and C++20. #4974
    • When Python psutil is installed, the test harness now supports a priority parameter, defaulting to idle. #5032
    • Increased the consistency of the swap_ranges() benchmark by adding allocators to control alignment. #5043
    • Updated our LLVM submodule, including new tests. #5038
    • Divided the increasingly large test for vectorized algorithms into smaller parts, extracting mismatch(), lexicographical_compare(), and lexicographical_compare_three_way() into a separate test. #5063
  • Code cleanups:
    • Removed compiler bug workarounds. #4939 #4944 #4947 #5017 #5103
    • Explicitly marked packaged_task's defaulted move constructor and move assignment operator as noexcept. #4940
    • Various cleanups (described in detail in the PRs, not repeated here). #4945 #5014 #5058
    • Refactored internal usage of the tuple-like and pair-like concepts. #4983
    • Used if constexpr to simplify eldritch horrors from beyond spacetime locale facets. #5001
    • Simplified control flow in basic_string::find_first_not_of()/find_last_not_of(). #5006
    • Refactored the vectorized implementation of bitset::to_string(). #5013
    • Replaced SFINAE with concepts in C++20-and-later code. #5044
  • Improved documentation:
    • Removed an inaccurate comment in list's move assignment operator. #5024
  • Infrastructure improvements:
    • Updated dependencies. #4947 #5017 #5082
      • Updated build compiler to VS 2022 17.13 Preview 1 (and 17.12 is now required).
      • Updated Clang to 18.1.8 (now required).
      • Updated CMake to 3.30 (now required).
      • Updated Python to 3.13.0 (now required).
      • Updated the PR/CI system to Windows Server 2025.
  • Build system improvements:
    • Removed a workaround in the benchmark build. #4928
  • Updated _MSVC_STL_UPDATE. #4926 #4994 #5064

VS 2022 17.12

  • Merged C++26 features:
  • Merged C++23 features:
    • P2286R8 Formatting Ranges, completed by:
      • Implemented range-default-formatter. #4716
      • Implemented formatter for the container adaptors stack, queue, and priority_queue. #4825
  • Merged LWG issue resolutions:
    • LWG-3944 #4784 Formatters converting sequences of char to sequences of wchar_t
    • LWG-4061 #4758 Should std::basic_format_context be default-constructible/copyable/movable?
    • LWG-4074 #4814 compatible-joinable-ranges is underconstrained
    • LWG-4083 #4786 views::as_rvalue should reject non-input ranges
    • LWG-4096 #4785 views::iota(views::iota(0)) should be rejected
    • LWG-4098 #4815 views::adjacent<0> should reject non-forward ranges
    • LWG-4106 #4757 basic_format_args should not be default-constructible
  • 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 static analysis warning C26818 "Switch statement does not cover all cases. Consider adding a 'default' label (es.79)." #4715
      • Note: The STL has always attempted to be /W4 /analyze clean, but does not yet attempt to be clean with respect to all additional static analysis rulesets.
    • Fixed atomic_ref::is_lock_free() on x64 to return true for 1, 2, 4, 8, and 16 bytes only. #4729
    • Fixed uniform_real_distribution<RealType>{min, max} to stay within the inclusive-exclusive range [min, max) and never generate the max value exactly. #4740
    • Fixed filesystem::weakly_canonical() to avoid failing on Windows 11 24H2 in certain scenarios. #4844
    • Fixed condition_variable_any::wait_for() to consistently use steady_clock. #4755
    • Removed a broken and useless visualizer for ranges::view_interface. #4835
    • Fixed the visualizer for move_iterator to use the updated name of its internal data member. #4836
      • This fixed a regression that was introduced by #1080 in VS 2019 16.8.
    • Fixed expected to conditionally delete its copy constructor and copy assignment operator as depicted in the Standard, which affects overload resolution in unusual scenarios. #4837
    • Fixed time_put/put_time() to avoid crashing for:
      • Unknown conversion specifiers. (Now they're copied unchanged.) #4840
      • Out-of-range tm fields. (Now they're replaced with a ? character.) #4883
    • Fixed compiler errors in ranges::inplace_merge and ranges::minmax in unusual scenarios. #4841
    • Fixed truncation warnings when:
      • Using conjunction and disjunction with non-bool_constant arguments. #4846
      • Calling algorithms with contiguous iterators whose difference types are narrower than ptrdiff_t. #4898
    • Improved array::size() and <mdspan> static analysis annotations, fixing warnings in some scenarios. #4856
    • Fixed lexicographical_compare_three_way() to enforce the Standard's mandate that the comparison returns a comparison category type. #4878
    • Fixed compiler errors in the parallel scan algorithms inclusive_scan(), exclusive_scan(), transform_inclusive_scan(), and transform_exclusive_scan() when the intermediate and output types are different. #4701
    • Fixed the vectorized implementation of floating-point ranges::min, ranges::max, and ranges::minmax to return correct results for negative zeros. #4734
    • Fixed Clang compiler errors for certain constexpr variant scenarios by adding a compiler bug workaround. #4903
    • Fixed compiler errors when using <random> machinery (e.g. generate_canonical(), uniform_real_distribution) via Standard Library Modules or Standard Library Header Units by adding compiler bug workarounds. #4906
    • Fixed compiler errors when using <format> machinery in user-defined modules by adding compiler bug workarounds. #4919
    • Fixed <format> to avoid crashing when formatting floating-point values with large precisions combined with the # (alternate form) or L (locale-specific form) options. #4907
  • Improved performance:
    • Overhauled condition_variable and condition_variable_any, improving their performance and simplifying their implementation. #4720
      • As a result, condition_variable, timed_mutex, and recursive_timed_mutex are now trivially destructible.
    • Improved the performance of search(), find_end(), and their ranges forms by removing calls to memcmp() that were surprisingly harmful. #4654 #4753
    • Improved the ARM64 performance of popcount() by using new compiler intrinsics. #4695 #4733
    • Further improved the vectorized implementations of:
      • The minmax_element() and minmax() algorithm families. #4659 #4739
    • Slightly improved the performance of ranges::min, ranges::max, and ranges::minmax for certain iterator types. #4775
    • On x86, the STL is now built with /arch:SSE2 (which is the default) instead of /arch:IA32. #4741
    • Used Clang builtins to improve the performance of <cmath>'s floating-point comparison functions for mixed types. #4648
    • On x64, atomic_ref<16 bytes> now always uses the cmpxchg16b instruction. #4751
    • Streaming a small bitset to a basic_ostream now avoids dynamically allocating memory. #4818
    • Slightly improved performance for Clang ARM64 <atomic>. #4870
    • Updated char_traits<wchar_t/char16_t>::compare/find/length, find, and ranges::find to call wmemcmp/wmemchr/wcslen when possible, which will improve performance after a future UCRT header update. #4873 #4894
    • Optimized equality comparisons for empty strings and string_views. #4904
  • Improved throughput:
    • Improved <queue> and <stack> throughput by dragging in fewer headers. #4707
  • Enhanced behavior:
    • P0608R3 Improving variant's Converting Constructor/Assignment is now unconditionally active (i.e. in C++17 mode and above), instead of being restricted to C++20 mode and above. #4713
      • This C++20 behavioral change was originally implemented by #1629 in VS 2019 16.10. While it can have source-breaking impact, it generally has highly desirable effects.
    • Changed the machinery for copying map/set nodes to use scope guards instead of throw;, making debugging easier when exceptions are thrown. #4749
    • Added debug checks to gcd() and lcm() for precondition violations. #4776
    • Added "lifetimebound" attributes to min, max, clamp, ranges::min, ranges::max, and ranges::clamp, allowing MSVC code analysis and Clang -Wdangling to detect dangling references in improper usage. #4838
    • Updated the precondition check in vector::pop_back() to be guarded by _CONTAINER_DEBUG_LEVEL. #4849
    • Renamed the parameters of views::iota and views::repeat to provide better IDE guidance. #4908
    • Simplified internal locale facet machinery to use class-specific operator new and operator delete overloads in both release and debug mode. #4916
  • Improved debugger visualization:
    • Inserted the debug visualizer changes from #3848, #4274, #4835, and #4836 in the VS repo so they'll finally ship.
  • Improved test coverage:
    • Updated LLVM-derived test coverage for <any>, <optional>, and <variant>. #4713
    • Properly tested the resolution of LWG-4053 "Unary call to std::views::repeat does not decay the argument". #4748
    • Improved the benchmarks for bitset::to_string(). #4817
    • Updated our LLVM submodule, including new tests. #4862 #4910
    • Re-enabled tests that were previously skipped in the libcxx test suite. #4721 #4732 #4911
    • Skipped tests that were sporadically failing due to incorrect timing assumptions. #4885
    • Added compiler bug workarounds. #4895
    • Tested the resolution of LWG-4105 "ranges::ends_with's Returns misses difference casting". #4897
    • Updated tests to work with Clang 19. #4912
    • Avoided unnecessary usage of rand(), which is considered harmful. #4921
  • Code cleanups:
    • Removed compiler bug workarounds. #4725 #4782 #4889
    • Various cleanups (described in detail in the PRs, not repeated here). #4724 #4900 #4920
    • Replaced SFINAE with concepts in C++20-and-later code. #4718 #4819
    • Removed a significant amount of unused code calling GetCurrentPackageId. #4742
    • Simplified how ranges::equal compares sizes. #4864
  • Reverted change:
    • Removed then temporarily restored support for targeting Windows 7 and Server 2008 R2. This will be permanently removed in 18.0 Preview 1. #4742 #4857
  • Infrastructure improvements:
    • The STL now clearly rejects attempts to:
      • Build a preset whose architecture doesn't match the compiler command prompt. #4709
      • Test a build whose architecture doesn't match the compiler command prompt. #4717
    • Updated dependencies. #4725 #4824 #4889
      • Updated build compiler to VS 2022 17.12 Preview 1 (and 17.11 is now required).
      • Updated CMake to 3.29 (now required).
      • Updated Ninja to 1.12.1.
      • Updated Python to 3.12.5.
      • Updated Google Benchmark to 1.8.5. #4851
  • Build system improvements:
    • Added /Zc:preprocessor to build the STL with the conformant preprocessor. #4886
    • Improved how CMake searches for the clang-format executable. #4888
  • Updated _MSVC_STL_UPDATE. #4706 #4708 #4754 #4872

VS 2022 17.11

  • Merged C++26 features:
  • Merged partial C++23 features:
  • Merged LWG issue resolutions:
    • LWG-3767 #4542 codecvt<charN_t, char8_t, mbstate_t> incorrectly added to locale
    • LWG-3919 #4526 enumerate_view may invoke UB for sized common non-forward underlying ranges
    • LWG-3950 #4510 std::basic_string_view comparison operators are overspecified
    • LWG-3984 #4543 ranges::to's recursion branch may be ill-formed
    • LWG-4012 #4529 common_view::begin/end are missing the simple-view check
    • LWG-4013 #4530 lazy_split_view::outer-iterator::value_type should not provide default constructor
    • LWG-4016 #4539 container-insertable checks do not match what container-inserter does
    • LWG-4035 #4525 single_view should provide empty
    • LWG-4053 #4685 Unary call to std::views::repeat does not decay the argument
    • LWG-4054 #4540 Repeating a repeat_view should repeat the view
  • Fixed bugs:
    • Fixed condition_variable::wait_until() and condition_variable_any::wait_until() to consistently use the given time_point's clock type, instead of also depending on the system clock. This also fixed condition_variable::wait_for() to consistently use steady_clock. #4457
    • Fixed <format> to always perform compile-time format string checking for wchar_t, even when the narrow execution character set doesn't support it. #4459
    • Fixed compiler errors when constexpr basic_string interacted with the undocumented compiler option /d1initall. #4474
    • Fixed atomic_ref for 16-byte objects to correctly report is_lock_free() and is_always_lock_free on x64 (when the optional mode _STD_ATOMIC_ALWAYS_USE_CMPXCHG16B is defined to be 1) and ARM64 (always). #4478
    • Removed the vectorized implementation of ranges::find with unreachable_sentinel as it was fundamentally incompatible with ASan (Address Sanitizer). #4486
      • This was introduced by #2434 in VS 2022 17.3.
    • Fixed incorrect results from the vectorized implementation of ranges::find_last for certain combinations of value and element types. #4561
      • This fixed a regression that was introduced by #3925 in VS 2022 17.9.
    • Fixed the STL to avoid emitting the off-by-default warning C4365 (signed/unsigned mismatch) when the /ZI compiler option (debug info for Edit and Continue) is used. #4487
      • These warnings were most noticeable when building the Standard Library Modules, but they were also emitted by classic includes.
    • Fixed the STL to avoid emitting the off-by-default warning C5246 (brace elision). #4527
    • Fixed compiler errors involving incomplete types in:
      • pair and tuple machinery. #4488
    • Fixed make_from_tuple() to properly implement LWG-3528 with a constraint instead of a static_assert. #4528
    • Added integral overloads for <cmath>'s classification functions fpclassify(), isfinite(), isinf(), isnan(), isnormal(), and signbit(). #4537
    • Fixed is_trivial to correctly handle unusual types. #4576
    • Avoided mentioning __vectorcall for ARM64EC, where it is not yet supported. #4600
    • Fixed std.ixx to include <intrin.h> in the Global Module Fragment, fixing compiler errors with import std; in certain scenarios. #4626
    • Fixed compiler errors when a user-defined formatter calls basic_format_parse_context::next_arg_id() with an empty format-spec. #4640
    • Fixed compiler errors when using <expected> in /permissive mode. #4658
      • Note: While /permissive mode is discouraged, it's currently supported for most STL components.
    • Fixed compiler errors when inheriting expected's constructors in certain scenarios. #4664
    • Fixed pair's self-swap() behavior to follow the Standard by self-swapping its elements. #4674
    • Fixed atomic<void*> and atomic_ref<void*> to provide difference_type. #4689
  • Improved performance:
    • Helped the compiler auto-vectorize:
      • replace_copy(), replace_copy_if(), ranges::replace_copy, and ranges::replace_copy_if. #4431
      • iota(). #4627
      • ranges::iota. #4647
    • Added vectorized implementations of:
      • find_first_of() and ranges::find_first_of. #4466 #4557 #4563 #4587 #4623
      • mismatch() and ranges::mismatch. #4495 #4538 #4584
      • replace() and ranges::replace for 32-bit and 64-bit elements. #4554 #4584
      • lexicographical_compare(), ranges::lexicographical_compare, and lexicographical_compare_three_way(). #4552
    • Further improved the vectorized implementations of:
      • count(), find(), ranges::count, ranges::find, and ranges::find_last. #4570 #4614
    • Used Clang builtins to improve the performance of <cmath>'s floating-point classification and comparison functions: #4612
      • Classification: isfinite(), isinf(), isnan(), isnormal()
      • Comparison: isgreater(), isgreaterequal(), isless(), islessequal(), islessgreater(), isunordered()
    • Improved normal_distribution::operator()(engine, param) by avoiding unnecessarily recomputing coefficients. #4618
  • Improved throughput:
    • Slightly improved <mdspan> throughput by using short-circuiting conjunction_v instead of fold expressions. #4559
    • Refactored floating-point machinery, improving throughput by reducing inclusion of various headers. #4615
    • Improved <string_view> throughput by no longer dragging in most of <string>'s contents. #4633
  • Improved diagnostics:
    • Improved compiler error messages when formatter<UDT>::format() isn't const. #4461
    • Massively improved the compiler error messages for get<T>(tuple<Types...>) when T doesn't occur exactly once in Types. #4578
    • Significantly improved compiler error messages when ranges::to is unable to construct the requested result. #4608
  • Enhanced behavior:
    • To reduce risk, the STL no longer attempts to activate vectorized implementations of algorithms for ancient processors that support SSE2 but not SSE4.2. #4550
      • This consolidated the STL's levels of vectorization to none, SSE4.2, and AVX2.
      • This also slightly improved performance (for non-ancient processors) by taking advantage of newer instructions in codepaths that previously restricted themselves to SSE2.
    • Added precondition checking in debug mode to:
      • views::take. #4551
      • The iota_view(first, last) constructor. #4616
    • Improved the wording of [[nodiscard("reason")]] messages for empty(). #4572
    • Extended C++20's static_assert(is_clock_v<Clock>) enforcement for various codepaths to C++14/17 (with internal machinery; is_clock_v itself remains guarded by C++20 mode). #4585
    • Changed the internal constructors of basic_format_arg::handle and basic_format_context to be private. #4489
    • Deprecation warnings for several non-Standard extensions are now emitted in all Standard modes, not just C++17 and later. These extensions will be removed in the future; you have been warned: #4605
      • stdext::checked_array_iterator, stdext::make_checked_array_iterator(), stdext::unchecked_array_iterator, and stdext::make_unchecked_array_iterator().
      • basic_istream's ipfx()/isfx() and basic_ostream's opfx()/osfx() member functions.
      • discard_block, linear_congruential, mersenne_twister, subtract_with_carry, uniform_int, and uniform_real.
  • Removed non-Standard code:
    • Deleted the <cvt/meow> subdirectory of headers, shrinking VS installations by 4.8 MB across 78 files. #4458
    • Deleted the <experimental/meow> headers that provided std::experimental::erase()/erase_if(). #4470
    • Removed the non-Standard _FPOSOFF macro and the non-Standard std::fpos::seekpos() member function. #4606
    • Removed the non-Standard lower_bound()/upper_bound() member functions from the unordered associative containers. #4607
  • Improved test coverage:
    • Added benchmarks for vectorized swap_ranges(). #4589
    • Added a workaround for an ASan failure in an ancient STL test. #4652
    • Reduced the execution time of the vectorized algorithms test by using the result of mismatch() when testing lexicographical_compare() and lexicographical_compare_three_way(). #4656
    • Improved the <filesystem> test, including its coverage of rename() and how it generates names for temporary files and directories. #4665
    • Re-enabled tests that were previously skipped in the libcxx test suite. #4698
    • Updated our LLVM submodule, including new tests. #4702
  • Code cleanups:
    • Removed compiler bug workarounds. #4475 #4576
    • Various cleanups (described in detail in the PRs, not repeated here). #4465 #4490 #4493
    • Improved the script for downloading Unicode data files when updating <format>. #4469
    • Consistently centralized how algorithms invoke their vectorized implementations. #4544
    • Simplified how condition_variable is implemented as a wrapper around the Windows API CONDITION_VARIABLE. #4545
    • Removed inline from constexpr variable templates. #4546
      • This became possible after all of our supported compilers implemented CWG-2387. Note that for constexpr variables, only primary templates and partial specializations no longer need to be marked as inline; explicit specializations and ordinary non-templates still need to be marked as inline.
    • Changed machinery for updating chrono::tzdb::version to activate the Named Return Value Optimization. #4577
    • Updated tests to use C++17 terse static_assert. #4588
    • Simplified function templates to use static_assert(false) as permitted by CWG-2518. #4591
    • Simplified debug checks for comparison function objects by using if constexpr. #4610
    • Simplified char_traits::assign() by removing unnecessary codepaths for constant evaluation. #4613
    • Changed checks for damaged logic in the STL itself to use internal static_assert macros, which expand to nothing outside of the STL's test suites. #4624
    • Simplified ranges::stable_sort to use iter_value_t instead of an internal helper. #4628
    • Changed the STL to use in_range<T>() more and numeric_limits<T>::min()/max() less. #4634
    • Replaced SFINAE with concepts in C++20-and-later code. #4637
    • Simplified the vectorized implementation of the minmax() family for 64-bit elements. #4661
    • Modernized our usage of Google Benchmark. #4662
  • Infrastructure improvements:
    • Overhauled our Azure Pipelines machinery: #4594 #4687
      • Introduced "Early Build" stages to quickly find compiler errors when building the STL.
      • Improved the reliability of the submodule checkout task.
      • Improved how clang-format diffs are uploaded and logged.
    • Updated dependencies. #4475 #4492 #4576 #4568 #4594 #4687
      • Updated build compiler to VS 2022 17.11 Preview 1.
      • Updated to Windows 11 SDK 22621. This is now required for building and testing the STL, but not for using it.
      • Updated CUDA to 12.4.0 (now required).
      • Updated Python to 3.12.3.
      • Updated Boost.Math to 1.85.0. #4599
      • Updated Google Benchmark to 1.8.4. #4694
  • Updated _MSVC_STL_UPDATE. #4467 #4556 #4655

VS 2022 17.10

  • Merged C++26 features:
  • Merged C++23 Defect Reports:
    • P2836R1 #4188 basic_const_iterator Should Follow Its Underlying Type's Convertibility
  • Merged partial C++23 features:
    • P2286R8 Formatting Ranges:
      • Implemented formatter<vector<bool>::reference>. #4133
  • Merged C++20 Defect Reports:
  • Merged LWG issue resolutions:
    • LWG-3749 #4190 common_iterator should handle integer-class difference types
    • LWG-3809 #4194 Is subtract_with_carry_engine<uint16_t> supposed to work?
    • LWG-3897 #4186 inout_ptr will not update raw pointer to null
    • LWG-3946 #4187 The definition of const_iterator_t should be reworked
    • LWG-3947 #4195 Unexpected constraints on adjacent_transform_view::base()
    • LWG-3949 #4204 atomic<bool>'s trivial destructor dropped in C++17 spec wording
    • LWG-3953 #4167 iter_move for common_iterator and counted_iterator should return decltype(auto)
    • LWG-3974 #4214 mdspan::operator[] should not copy OtherIndexTypes
    • LWG-4001 #4193 iota_view should provide empty
  • Fixed bugs:
    • Fixed mutex's constructor to be constexpr. #3824 #4000 #4339
      • Note: Programs that aren't following the documented restrictions on binary compatibility may encounter null dereferences in mutex machinery. You must follow this rule:

        When you mix binaries built by different supported versions of the toolset, the Redistributable version must be at least as new as the latest toolset used by any app component.

      • You can define _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR as an escape hatch.
    • Fixed <format>'s compile-time format string checking:
      • To detect when user-defined formatter specializations reject omitted format specifications like "{}". #4078
      • To require that dynamic width and precision arguments have integral types. #4155
    • Fixed how format() handles empty strings like format("{:a<10}", ""). #4243
    • Fixed <format> to properly handle floating-point values in a specific situation. When a format-specifier appears without any precision or type, shortest round-trip formatting should be used instead of chars_format::general. #4327
      • Example format strings: "{:}" and "{0:}" were affected, as they have an optional arg-id (0) followed by a format-specifier (:) with an empty format-spec (nothing after the :).
      • More common format strings like "{}" and "{0}" were unaffected, as they entirely lack a format-specifier.
      • Example value: For 12345678.0, the shortest round-trip rules produce "12345678", while the chars_format::general rules produce "1.2345678e+07".
    • Fixed <format> to properly handle locale-specific floating-point formatting with a minimum field width, taking digit separators into account. #4421
    • Fixed format() to accept %X and %EX for chrono::duration and chrono::hh_mm_ss. #4250
    • Fixed chrono::duration formatting to respect dynamically provided widths. #4283
    • Fixed crashes and incorrect results in the vectorized implementation of ranges::find with unreachable_sentinel. #4450
      • This fixed regressions that were introduced by #2434 in VS 2022 17.3.
    • Fixed ranges::to to properly reject certain invalid uses with compiler errors, instead of trapping compilers in infinite loops of doom. #4142
    • Fixed ranges::to to accept certain container constructors taking a range followed by more than one argument. #4218
    • Fixed compiler errors involving range adaptor closure objects in unusual scenarios. #4211
    • Fixed ranges::ssize to be conditionally noexcept as required by the Standard. #4231
    • Fixed join_view and join_with_view's iterators to be default constructible. #4264
    • Fixed truncation warnings when using views::repeat. #4255
    • Fixed compiler errors when using views::zip_transform with ranges that must be non-const to be iterated through, such as views::filter. #4416
    • Fixed compiler errors when using views::pairwise_transform and views::adjacent_transform via Standard Library Modules. #4420
    • Fixed incorrect output from iostreams (like "i.nf") when printing infinity and NaN values with setprecision(0) << showpoint << fixed. #4212
    • Fixed problems involving unusual allocators with size types other than size_t:
      • Compiler errors in basic_stringbuf::overflow(). #4219
      • Truncation warnings in basic_stringbuf's constructor, string/vector iterator subtraction, ranges::is_permutation, and allocate_shared(). #4228 #4237 #4252
    • Fixed <atomic> correctness issues for ARM64 CHPE (_M_HYBRID_X86_ARM64). #4222
    • Fixed atomic by adding atomic& operator=(const atomic&) volatile = delete; as required by the Standard. #4287
    • Fixed atomic<shared_ptr>::wait() and atomic<weak_ptr>::wait() to properly detect equivalent smart pointers. #3655
    • Fixed sign-compare warnings in <mdspan> when using extents with different index types. #4227
    • Fixed compiler errors in <mdspan> when constructing unusual mappings. #4236
    • Fixed bugs specific to extremely unusual fancy pointers:
      • Fixed how such vectors interact with ranges algorithms. #4244
      • Fixed how such vectors and basic_strings interact with classic algorithms and iterator spaceship comparisons. #4275
    • Fixed compiler errors when constructing locale{nullptr}. #4245
      • Rejoice, for now you can get a guaranteed runtime_error!
    • Fixed compiler errors when overloading next(), prev(), shift_left(), and shift_right() with concept-constrained functions that should be preferred during overload resolution. #4249
    • Fixed compiler errors when comparing a sub_match with the spaceship operator <=> to a basic_string with a custom traits and/or allocator type. #4253
    • Fixed sequence container constructors to avoid interfering with CTAD (class template argument deduction) for (Iter, Iter, BadAlloc); now this will SFINAE away instead of emitting a hard compiler error. #4254
    • Fixed compiler errors in parallel transform_reduce() when performing narrowing conversions. #4260
      • As usual, asking the STL to perform conversions on your behalf may emit sign/truncation compiler warnings; this is by design.
    • Fixed compiler errors during constexpr evaluation of vector<bool> caused by improper casting in iterator debugging machinery. #4276
    • Fixed compiler errors (by adding a compiler bug workaround) when using constexpr invoke() to call pointers to data members with reference_wrapper arguments. #4277
    • Added macroization defenses for the STL's non-Standard extensions (e.g. type_info's raw_name member function). #4285
    • Fixed floating-point to_chars() on ARM64 to return correct results. #4304
    • Fixed compiler errors when defining variadic alias templates for is_nothrow_convertible. #4318
    • Fixed filesystem::is_empty() and filesystem::directory_iterator to handle empty volumes (before they've been assigned a drive letter). #4311
    • Fixed compiler errors in algorithms involving highly unusual types. #4233 #4419
    • Fixed basic_stringbuf to avoid implementing moving with swapping, which is a correctness issue for unusual custom allocators. #4239
    • Fixed deque::shrink_to_fit() to follow the Standard instead of unconditionally moving elements. #4091
    • Fixed allocate_shared_for_overwrite() to directly destroy objects, instead of using Alloc::destroy(). #4274
    • Removed ios_base::hexfloat, a non-Standard bitmask element. #4345
      • The Standard ways to request hexadecimal floating-point output are to use the ios_base::fixed | ios_base::scientific bitmask elements together or to use the std::hexfloat manipulator.
    • Fixed std.ixx to export VCRuntime machinery with Standard-conforming techniques. #4375
      • This affects things like std::exception, std::type_info, and ::operator new. The MSVC compiler currently doesn't enforce the rule in question here, but stricter tools might notice this.
    • Fixed basic_ostream::operator<<(basic_streambuf*) to rethrow caught exceptions only when failbit is set in exceptions(). #4372
    • Fixed unordered_map and unordered_set's equality operators to test elements for equality (via their operator==), not just equivalence (via the container's predicate for keys). #4406
      • unordered_multimap and unordered_multiset already behaved correctly.
    • Silenced "warning C4324: structure was padded due to alignment specifier" in all STL headers. #4426
      • This was spuriously emitted by certain combinations of code, e.g. views::cartesian_product with views::filter.
    • Fixed time_get::date_order() to correctly return time_base::mdy for the "C" locale, instead of picking up the date order for the current user locale. #4437
    • Fixed seed_seq::generate(RanIt, RanIt) to static_assert that the iterator's value type is at least a 32-bit unsigned integer type. #4447
    • Fixed compiler errors involving incomplete types in:
      • Non-modifying algorithms. #4138
      • erase(), erase_if(), remove(), remove_if(). #4217
      • [alg.min.max], [alg.clamp], [alg.lex.comparison], [alg.three.way] algorithms. #4216
      • atomic and atomic_ref. #4221
      • Modifying algorithms. #4256
      • Container operations taking iterator pairs. #4258
      • is_nothrow_convertible. #4318
      • Comparison operators. #4334
      • Merge algorithms, set operations, heap operations, and permutation generators. #4347
      • Sorting and related algorithms. #4367
      • vector's destructor and other member functions. #4373
      • Uninitialized memory algorithms. #4374
      • default_searcher. #4379
      • <ranges> views. #4389
      • Numeric algorithms. #4391
      • ranges::advance, ranges::distance, span constructors, and condition_variable::wait_for. #4402
      • shared_ptr creation functions and atomic smart pointers. #4403
      • function, move_only_function, packaged_task, promise, and optional. #4430
  • Improved performance:
    • Improved <atomic> performance: #4222
      • For ARM64, significantly improved the performance of atomic<T>::load() (taking no arguments, requesting sequential consistency), matching how #3399 in VS 2022 17.6 improved atomic<T>::load(memory_order_seq_cst).
      • For ARM64 CHPE (_M_HYBRID_X86_ARM64), atomic<T>'s exchange/compare_exchange_MEOW/fetch_MEOW now respect memory_order arguments instead of always providing sequential consistency. Also, ARM64 CHPE now benefits from all of #3399's major improvements.
    • Improved atomic::wait family performance by internally using memory_order_acq_rel instead of memory_order_seq_cst when initializing OS support functions. #4288
    • Slightly improved the codegen for uniform_int_distribution. #4234
    • Optimized filesystem::path's operator/ to perform a single memory allocation for common cases. #4136
    • Slightly improved performance by taking advantage of P1169R4 static operator() in the STL's stateless function objects and lambdas. #4358
      • This is conditional on compiler feature availability (currently implemented by Clang), but not on Standard mode. Like C++17 if constexpr and C++20 explicit(bool), compilers will support C++23 static operator() in earlier Standard modes (emitting warnings that Future Technology is being used, which the STL internally suppresses).
    • Added a vectorized implementation of bitset::to_string(). #3960 #4382 #4422
    • Improved the vectorized implementations of min_element(), max_element(), minmax_element(), and related algorithms:
      • Extended them to handle floating-point types. #3928
      • Further improved performance by restructuring control flow. #4401
    • Improved the vectorized implementations of ranges::min, ranges::max, ranges::minmax, and the min(), max(), and minmax() overloads for initializer_list. #4384
      • These algorithms only need to track values, not locations.
    • Changed the destructors of mutex and recursive_mutex to be trivial. #4390
      • This especially benefits variables with static storage duration, as they no longer need "dynamic atexit destructors".
    • Slightly improved performance by replacing CRITICAL_SECTION with SRWLOCK in:
      • get_new_handler() and set_new_handler(). #4407
      • At-thread-exit machinery. #4408
  • Enhanced behavior:
    • Wrapped the STL in extern "C++" as a temporary workaround to allow #include <meow> to coexist with import std; in the same translation unit, in that order. #4154
      • The other order, import std; before #include <meow>, will still cause compiler errors. We're working on a long-term solution.
    • The C++17 Standard added invoke() and the C++20 Standard made it constexpr. Previously, MSVC made non-constexpr invoke() unconditionally available, and constexpr invoke() available in C++17 mode, as minor extensions. Now, constexpr invoke() is unconditionally available. #4080
    • Improved shared_ptr constructor constraints to avoid forming invalid types. #4290
    • Updated <charconv> to use the __umulh intrinsic for ARM64 CHPE (_M_HYBRID_X86_ARM64). #4330
    • Improved expected's copy/move assignment operators to be trivial when possible, like how optional and variant already behave. #4271
    • Improved <random>'s TR1 legacy code: #4284
      • Deprecated the non-Standard engines (discard_block, linear_congruential, mersenne_twister, subtract_with_carry) and distributions (uniform_int, uniform_real) that are still provided in the std namespace.
      • Removed non-Standard machinery from Standard engines and distributions. (For example, certain static constexpr data members in mersenne_twister_engine and an extra function call operator overload in uniform_int_distribution.)
    • Changed basic_regex's constructor to throw an exception instead of stack overflowing when the pattern contains an excessive number of capture groups. #4451
      • Currently, this arbitrarily limits the number of capture groups to 1000.
  • Improved test coverage:
    • Updated the STL-ASan-CI pipeline. #4240 #4295
    • Added support for building the STL's separately compiled code with ASan instrumentation and enabled this in the STL-ASan-CI pipeline. #4313
    • Updated our LLVM submodule, including new tests. #4263 #4267 #4270 #4272 #4328 #4336 #4348 #4355
    • Minor test improvements, including printing exit codes in both decimal and hex. #4309
    • Improved output for "unresolved" test failures. #4323
    • Fixed sporadic "unresolved" test failures. #4366
    • Updated CTest to avoid running 2N tests in parallel, where N is the number of cores available. #4335
    • Enabled __cpp_lib_concepts for our command-line test coverage of the EDG compiler front-end. #4296 #4297 #4440
      • __cpp_lib_concepts was already enabled for EDG-powered IntelliSense in the VS IDE, so this change isn't directly observable by users, it'll just help the STL work better with IntelliSense in the future.
    • Enabled compiler warnings when building the STL's benchmarks. #4356
    • Added benchmarks for vectorized ranges::find and ranges::count. #4387
      • This also covers classic find() and count(), which share the same vectorized implementation.
    • Fixed the test harness to handle paths case-insensitively. #4395
    • Updated tests to work with Clang 18. #4452
    • Enabled more test coverage for the off-by-default warning C4668 "'MEOW' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'". #4441
  • Code cleanups:
    • Various cleanups (described in detail in the PRs, not repeated here). #4143 #4145 #4146 #4147 #4149 #4151 #4192 #4229 #4230 #4362 #4439 #4442 #4443 #4444 #4445
    • Removed unnecessary typename keywords in C++20 mode and later. #4191
    • Removed compiler bug workarounds. #4197 #4259 #4340 #4392
    • Removed an enormous amount of code that was dealing with __cpp_lib_concepts missing in C++20 mode. #4298 #4364
      • Now, the STL's product and test code assumes that concepts are always available in C++20 mode, with targeted workarounds for reported compiler bugs.
    • Unified our internal stringizing macros. #4405
    • Added top-level const to function parameters in the vectorized implementations of algorithms. #4410
    • Added a script to download Unicode data files when updating <format>. #4435
    • Simplified how we handle Unicode field widths when updating <format>. Now we use a single script to process all Unicode data files, emitting tables into a single generated header. #4446
    • Used if constexpr to simplify helper functions for allocating and deallocating memory. #4432
  • Infrastructure improvements:
    • Updated dependencies. #4197 #4206 #4259 #4303 #4392
      • Updated build compiler to VS 2022 17.10 Preview 1 (now required).
      • Updated CMake to 3.28 (now required).
      • Updated Clang to 17.0.3 (now required).
      • Updated Python to 3.12.2.
      • Updated Boost.Math to 1.84.0. #4280
  • Updated _MSVC_STL_UPDATE. #4213 #4226 #4293 #4361

Older Versions