New
MSVC Build Tools 14.50
This shipped in VS 2026 18.0.
- The STL no longer supports targeting Windows 7 / Server 2008 R2, Windows 8 / Server 2012, and Windows 8.1 / Server 2012 R2:
Unclaimed project
Are you a maintainer of STL? Claim this project to take control of your public changelog and roadmap.
This shipped in VS 2026 18.0.
__fastfail<filesystem> implementation by unconditionally calling APIs that were added in Windows 8. #5434multiline option should be added to syntax_option_type
regex behavioral change, so we added an escape hatch. By default, we define _REGEX_LEGACY_MULTILINE_MODE to 0, which requests Standard behavior:
regex_constants::multiline can be requested.regex_constants::multiline is ignored; see N5008 [tab:re.synopt]._REGEX_LEGACY_MULTILINE_MODE to 1 requests legacy behavior:
regex_constants::multiline is redundant.regex_traits::transform_primary mistakenly detects typeid of a functionexpected constructor from a single value missing a constraintranges::distance does not work with volatile iteratorsregex's behavior:
basic and grep grammars to properly handle ^ caret characters. #5165basic and grep grammars to properly handle $ dollar characters. #5362basic and grep grammars to make backreferences to unmatched capture groups fail to match anything, instead of matching the empty string "". #5376basic and grep grammars to properly handle backslashes inside square-bracket character classes. #5523] right square bracket at the beginning of a character range. #5364ECMAScript grammar's (?!pattern) negative lookahead assertions to make capture groups within them always match nothing after the assertions succeed. #5366ECMAScript grammar's \b word boundary assertion to not match the empty string "" (and inversely for the \B negative word boundary assertion). #5375ECMAScript grammar's \c escapes to require the following ControlLetter to be an ASCII alphabetic character. #5524
\ca through \cz and \cA through \cZ are allowed.ECMAScript grammar to reset all capture groups to "unmatched" at the start of each repetition of a loop. #5456ECMAScript grammar to reject bogus groups by throwing a regex_error with the code regex_constants::error_badrepeat, removing the non-Standard code regex_constants::error_syntax that was previously used. #5542
(?:meow) and positive/negative lookahead assertions (?=meow)/(?!meow) are allowed; other characters following (? are bogus. Notably, the C++ Standard doesn't support the lookbehind assertions (?<=meow)/(?<!meow) that were added in later versions of ECMAScript.ECMAScript, basic, grep, and awk grammars to properly handle escape sequences. #5380
\] as an identity escape for a right square bracket. #5399\D for non-digits, \S for non-whitespace, \W for non-words) inside square-bracket character classes when matching against Unicode characters. #5403 #5487
[\w\s] for words and whitespace) when matching against Unicode characters. #5438regex_constants::collate to follow the locale's collation order. #5238regex_constants::icase and regex_constants::collate to translate each character exactly once before any comparisons. #5553collate<wchar_t> to follow the locale's collation order when compiling with /Zc:wchar_t- (making wchar_t a non-Standard typedef for unsigned short) and linking to the STL dynamically (with /MD or /MDd). #5361collate::do_transform() handles wrongly encoded input. #5431collate::do_hash() to return equal hashes for strings that collate as equivalent. #5469ranges::enable_view to correctly report false for ranges::view_interface itself. #5369 #5407<filesystem> status functions to avoid failing for invalid paths when the current directory is a network path. #5381repeat_view's piecewise constructor for certain scenarios. #5388constexpr copy() for vector<bool>. #5347
barrier constructor's exception specification to be conditionally "strengthened", instead of unconditionally. #5398_HAS_EXCEPTIONS=0 mode when constructing system_error, chrono::ambiguous_local_time, and chrono::nonexistent_local_time. #5406volatile ranges to basic_string's from_range constructor and append_range(), assign_range(), insert_range(), and replace_with_range() member functions. #5409nth_element() and ranges::nth_element to have worst-case linear complexity, instead of quadratic. #5100destroy(), destroy_at(), destroy_n(), ranges::destroy, ranges::destroy_at, and ranges::destroy_n to destroy objects during constant evaluation even when they're trivially destructible. #5449num_get::do_get() for bool to properly handle bad digit groupings. #5476thread::hardware_concurrency() to correctly report the total number of logical processors when more than 64 are available, for both single-socket and multi-socket machines. #5459<mdspan>'s layout_stride::mapping<E>::is_exhaustive() to correctly handle unusual extents. #5477reverse_copy() and ranges::reverse_copy being improperly vectorized for pair<T&, U&> on x86 (where such pairs are 8 bytes). #5528
chrono::zoned_time to provide a fallback time zone abbreviation (of the form "-05" or "+0530") when the system's code page can't represent the localized abbreviation that would normally be returned. #5558counting_semaphore::try_acquire_for() to consistently use steady_clock. #5575basic_string<char_like_struct>. #5563<chrono>. #5629-Wcharacter-conversion warning in <locale> by avoiding implicit conversions between charN_t types. #5653stable_sort() and ranges::stable_sort when sorting huge inputs on x86. #5677
filesystem::temp_directory_path(error_code&) to return an empty filesystem::path when an error is encountered. #5570regex matching:
regex starts with a ? question mark quantifier or several alternatives, by avoiding quadratic complexity. #5457regex starts with a + plus quantifier (or {min,} or {min,max} quantifiers requiring at least 1 repetition). #5509regex contains no capture groups, by avoiding unnecessary allocations. #5518regex patterns, by not generating unnecessary "if" nodes with a single branch. #5539regex starts with positive/negative word boundary assertions \b/\B and lookahead assertions (?=meow)/(?!meow). #5576std::search() internally. #5586regex_constants::collate mode. #5672[[msvc::no_unique_address]] as a space optimization in several C++23 components. #4960basic_string::find_first_not_of() and basic_string::find_last_not_of() for one character. #5102basic_string::find_first_not_of() and basic_string::find_last_not_of() for multiple characters. #5206adjacent_find() and ranges::adjacent_find. #5331unique() and ranges::unique. #5092 #5363search_n() and ranges::search_n for small values of n. #5352remove_copy(), ranges::remove_copy, unique_copy(), and ranges::unique_copy. #5355is_sorted_until() and ranges::is_sorted_until. #5420 reverse_copy() and ranges::reverse_copy. #5493find() and ranges::find. #5597ranges::find for 2-byte elements on ARM64, matching find()'s behavior. #5628__is_trivially_equality_comparable to improve the performance of equal(), ranges::equal, and many vectorized algorithms for more types. #5527search_n() and ranges::search_n for n=1 to internally call find() and ranges::find. #5346has_single_bit(), especially when popcount() intrinsics are unconditionally available. #5367 #5534
/arch:AVX and ARM64 can unconditionally use popcount() intrinsics.poisson_distribution's constructor by avoiding unnecessary work. #5411minstd_rand and minstd_rand0's discard() member function. #5412linear_congruential_engine performance by using our modern internal implementation of 128-bit integers. #5436 #5473chrono::tzdb::locate_zone() by using binary searches for time zone names. #5548std::includes() to have the same performance as ranges::includes. #5543 #5595count() for vector<bool>. #5640is_scoped_enum. #5358replace_copy(), replace_copy_if(), reverse_copy(), rotate_copy(), and their ranges counterparts. #5495<mdspan>'s debug checks in layout_stride::mapping<E>'s constructor. #5505vector<bool>::max_size() with the compiler's upcoming implementation of Defect Report P2280R4. #5550 #5566regex parsing to detect excessive recursion (caused by extreme numbers of non-capturing groups or lookahead assertions) and throw a regex_error with the code regex_constants::error_stack. #5588<regex> matching to use heap allocations for saved match state, slightly reducing stack pressure. #5682/O2 /Ob1 to /O2 /Ob2, producing more realistic and useful results. #5370normal_distribution is used in benchmarks and tests. #5404iter_rvalue_reference_t test in response to a compiler change. #5378search_n() and ranges::search_n. #5439 #5440"Czech_Czechia.1250". #5480source_location test coverage to handle upcoming changes in the EDG front-end used for IntelliSense. #5551<regex> test failures in the libcxx suite. #5587lerp() test on ARM64. #5687ranges::search_n. #5343regex quantifiers. #5253char_traits::assign(). #5488if constexpr (condition) { ... } else { ... }, improving clarity and avoiding unreachable code. #5643<chrono> initializes a tm struct. #5662