MSVC's implementation of the C++ Standard Library.
<syncstream>
osyncstream
Manipulators<chrono>
Calendars And Time Zones:
<chrono>
's format()
support (via formatter
specializations) and remaining operator<<()
overloads, completing this feature.icu.dll
which is provided by Windows 10 version 1903/19H1 or later. This applies to both client and server OSes; note that Windows Server 2019 is based on Windows 10 version 1809.basic_stringbuf
's Buffervariant
's Converting Constructor/Assignment<format>
Text Formattingconstexpr
Containersconstexpr
std::string
constexpr
std::vector
constexpr
std::string
.<source_location>
consteval
(see Clang's C++20 status).<=>
To The Libraryregex::icase
. #1503
std::equal()
with user-defined contiguous iterators. #1527
boolalpha
extraction to be case-sensitive again. #1543 #1570 (This was a regression in VS 2019 16.8 caused by #1168.)std::fill()
with volatile byte*
. #1557
ranges::unique
to correctly handle inputs that are already unique. #1561
<atomic>
and <bit>
, related to compiler intrinsics. #1505
std::allocator
members that were deprecated in C++17. (As usual, fine-grained and coarse-grained escape hatches are available for this removal.) #1585
binomial_distribution
. #1531
min
/max
values for several <random>
distributions. #1601
gamma_distribution::param_type::operator==
. #1601
__declspec(dllexport)
ing a class derived from unordered_map
or unordered_set
would fail to compile with a static_assert
. #1639
ranges::uninitialized_copy
, ranges::uninitialized_copy_n
, ranges::uninitialized_move
, and ranges::uninitialized_move_n
when attempting to use memcpy
for efficiency. #1548
ranges::uninitialized_value_construct
and ranges::uninitialized_value_construct_n
when attempting to use memset
for efficiency. #1700
year_month_day_last::day()
to return a valid-but-unspecified value for !ok()
dates, as required by the Standard. #1663
<memory>
would fail to compile with /std:c++latest
/Zc:alignedNew-
. #1689
get_time()
. #1620
"19700405T000006"
can now be parsed with "%Y%m%dT%H%M%S"
.'%'
conversion specifications) is now case-insensitive.ios_base::eofbit | ios_base::failbit
is now set.'%'
appearing as the last character of a format specification) now result in ios_base::failbit
instead of literal matching.60
to handle leap seconds.ranges::uninitialized_copy
and ranges::uninitialized_move
when attempting to use memcpy
for efficiency. #1713
ranges::uninitialized_meow()
algorithms assumed that <algorithm>
was included; now they can be called after including only <memory>
. #1832
<complex>
(warning C5219: implicit conversion from 'const int'
to 'const float'
, possible loss of data). #1722
make_shared
and allocate_shared
with noexcept(false)
destructors. #1736
#include
to import
. #1781
<cmath>
's usage of new compiler intrinsics in ceil
, copysign
, floor
, round
, and trunc
would fail to compile with CUDA and the Intel C++ Compiler. #1886
countr_zero()
and countr_one()
in <bit>
are now faster for uint8_t
and uint16_t
. #1540
atomic
locks on x86/x64 now use the _mm_pause
intrinsic with increasing back-off. #1146
<charconv>
's integer to_chars()
for the bases 3, 5, 6, 7, and 9. #1622
<chrono>
's conversions between year_month_day
and sys_days
. #1634 #1646
std
algorithm optimizations to std::ranges
algorithms and generalized those optimizations from pointers to contiguous iterators. #1433 #1772
header-units.json
, a file that will tell the compiler which headers are eligible to be automatically treated as header units at the user's request. (That is, there will be a compiler option allowing #include <vector>
to be treated as import <vector>;
without changing the source code.) #1545
[[nodiscard]]
to several member functions in <hash_map>
and <hash_set>
, even though these non-Standard headers are deprecated and will be removed soon. #1574
static_assert(is_clock_v<Clock>);
as required by N4878 [thread.req.paramname]/1. #1687
<coroutine>
is now supported in C++14 mode and C++17 mode; the new /await:strict
compiler option activates this "downlevel" support. #1730
<coroutine>
remains supported in C++20 mode with no additional compiler options.stl/debugger/STL.natvis
. #1720
<complex>
's 80-bit long double
detection logic to work with Clang in addition to the Intel C++ Compiler. #1728
long double
remains unsupported by MSVC./MP
. #1529
libcxx
test suite. #1594
default_initializable
concept. #1604
if constexpr
for compiler throughput and code clarity. #1544
<charconv>
's product/test code to be more compatible with libc++. #1670
[[nodiscard]]
attributes to appear before __declspec
specifications for functions (otherwise, [[nodiscard]]
is ignored). #1703
constinit
. #1611
_Ugly
, following the Standard's strict requirements. #1743
__cpp_lib_concepts
isn't defined. #1749
<optional>
. #1788
parallelize
tool, which is used to run clang-format
on all files in the codebase. #1632
tr1
test suite. #1697
_MSVC_STL_UPDATE
. #1535 #1552 #1626 #1708 #1801
polymorphic_allocator<>
<stop_token>
And jthread
<=>
strong_order
, weak_order
, partial_order
, compare_strong_order_fallback
, compare_weak_order_fallback
, and compare_partial_order_fallback
.assume_aligned()
[[nodiscard]]
For Constructors<chrono>
Calendars And Time Zones:
operator<<(basic_ostream&, const duration&)
common_iterator
views::take
and views::drop
now handle basic_string_view
as specified in P1739R4.ranges::construct_at
and ranges::destroy_at
ranges::uninitialized_default_construct
, ranges::uninitialized_default_construct_n
, ranges::uninitialized_value_construct
, ranges::uninitialized_value_construct_n
, ranges::uninitialized_fill
, ranges::uninitialized_fill_n
, ranges::uninitialized_copy
, ranges::uninitialized_copy_n
, ranges::uninitialized_move_n
istream_iterator
, ostream_iterator
, istreambuf_iterator
, and ostreambuf_iterator
) to model the C++20 iterator conceptsranges::drop_while_view
ranges::elements_view
ranges::istream_view
ranges::take_while_view
views::common
views::counted
polymorphic_allocator::destroy
is extraneouspackaged_task
deduction guidesis_always_equal
added to std::allocator
makes the standard library treat derived types as always equalstd::tuple<>
should be trivially constructibletransform_view
's sentinel
<false>
not comparable with iterator
<true>
noop_coroutine_handle
guaranteesistream::gcount()
can overflowinvocable_r
family of type traits to handle C++17 deferred temporary materialization. #1282
atomic_ref<[u]int8_t>::operator--(int)
. #1303
complex
. #1294
constexpr
destruction of memory_resource
. #1314
std::filesystem::create_directories()
now throws an exception (or fails with an error_code
) when called with an empty path
. #1285
intrin0.h
including intrin.h
, which no longer happens. #1300
geometric_distribution
, poisson_distribution
, binomial_distribution
, and gamma_distribution
. #1159
normal_distribution
, lognormal_distribution
, fisher_f_distribution
, and student_t_distribution
. #1228
bind_front()
to determine its return type from the decayed types of its arguments. #1293
pow(complex, arithmetic)
to strictly follow the Standard's rules and return correct results. #1299
_Node_handle
- the internal class template that reifies the Standard's node-handle
family of exposition-only types - to destroy contained values with an allocator rebound to the value type instead of to the type of the node. #1310
duration::max()
) to absolute times in condition_variable_any::wait_for()
, condition_variable::wait_for()
, recursive_timed_mutex::try_lock_for()
, shared_timed_mutex::try_lock_for()
, shared_timed_mutex::try_lock_shared_for()
, this_thread::sleep_for()
, and timed_mutex::try_lock_for()
. #1371
<experimental/generator>
in /kernel
mode. #1373
std::atomic_init
; C++20 deprecated it (which we previously implemented) and changed its effects to be equivalent to a relaxed store (which we previously missed). #1090
get_time()
to correctly handle format specifications without delimiters; for example, "20201029"
can now be parsed with "%Y%m%d"
. #1280
map
, multimap
, set
, multiset
) so that their move constructors and move assignment operators don't attempt to swap their comparators (which could fail to compile, especially for lambdas which aren't assignable). #1357
streambuf
, threw an exception from its constructor. #1358
noexcept(noexcept(is_nothrow_v))
(which is always noexcept(true)
). Now they say noexcept(is_nothrow_v)
as intended. #1417
hash<coroutine_handle<>>::operator()
as const
, required by the Standard. #1423
complex
sqrt()
and log()
: #935
sqrt()
overflow for huge inputs.sqrt()
inaccuracy for tiny inputs, due to internal underflow.log()
inaccuracy for tiny inputs, due to internal underflow.log()
when |z| ~= 1.log(complex<float>{1, 0})
for certain combinations of compile-time and run-time settings; now it correctly returns 0
.new-delete-type-mismatch
issue in valarray
. #1496
basic_string_view
's (iterator, sentinel) constructor. #1510
regex_traits::transform()
to accept arbitrary forward iterators instead of requiring raw pointers. #1494
static_assert
that was preventing atomic_ref<const T>
from compiling. #1500
<atomic>
in C++20 mode with Clang targeting ARM64. #1509
<charconv>
from_chars()
by simplifying how it assembles floating-point values, and by using the branchless rounding technique that was originally invented for hex
precision to_chars()
. #1220
vector
's move constructor to be more optimizer-friendly. #1330
fill
family of algorithms (including fill_n
, the uninitialized_
forms, and the ranges::
forms) to use memset
when setting scalars to all-bits-zero. #1273
<cmath>
's float
and long double
overloads of ceil
, copysign
, floor
, round
, and trunc
. #1336
views::filter
and views::transform
now properly move from their stashed function objects when possible. #1410
strong_order
and weak_order
now compare floating-point values without branching on the sign bit. #1475
_Execute_once()
, an internal helper function, to be compatible with XFG, an enhanced version of the Control Flow Guard feature. #1318 #1356
optional::operator*
and optional::operator->
that fire when called on an empty optional
when _CONTAINER_DEBUG_LEVEL > 0
(which is implied by _ITERATOR_DEBUG_LEVEL != 0
). #1362
<tuple>
no longer includes <new>
.less
, equal_to
, greater
, plus
, etc., and the recently-added compare_three_way
) now emit [[nodiscard]]
warnings. #1474
if constexpr
, and changed several uses of type trait structs to variable templates (which the MSVC compiler recognizes and efficiently handles). #1413
::std::
qualification to certain names, improving throughput for extremely large tuple
s (noticeable with 50+ elements). #1490
llvm-project
and the --progress
option to the README's instructions for the initial submodule sync. This takes longer (a lot longer), but it simplifies the testing instructions later. #1441
<charconv>
to_chars()
test cases. #1278
get_time()
being called with a format specification that's longer than the stream's contents. #1326
libcxx
test suite. #1090
const
rvalues. #1393
/analyze:autolog-
to /analyze:only
test configurations; together, these compiler options run code analysis without producing an object file (/analyze:only
) and without writing detailed analyzer results to an XML file (/analyze:autolog-
), as we're simply looking for any warnings from code analysis. #1434
tests/std/tests/VSO_0226079_mutex
that could intermittently fail due to system_clock
time adjustments on virtual machines. #1473
#include
directives from stl/src
files, and changed inclusions from <meow.h>
to <cmeow>
. #1270
ranges::uninitialized_default_construct_n
. #1377
unsigned int
instead of unsigned
. #1390
initializer_list
with Standard code, instead of our internal constructor. #1400
remove_cvref_t
the argument to enable_borrowed_range
(because the library doesn't allow user specializations for cv-qualified types or reference types). #1415
<ranges>
machinery to _Category_base
, which avoids shadowing the internal _Iterator_base
used throughout the STL. #1420
<ranges>
"expression-equivalent" machinery by extracting a constexpr
"strategy" variable. #1426
_MSVC_STL_UPDATE
. #1272 #1340 #1439
atomic_ref
<bit>
that were previously only supported when compiling with Clang (bit_ceil
, bit_floor
, bit_width
, countl_one
, countl_zero
, countr_one
, countr_zero
, has_single_bit
, popcount
, rotl
, and rotr
).midpoint()
, lerp()
by adding constexpr
support and improving handling of infinite arguments.execution::unseq
constexpr
constexpr
INVOKEranges::move
ranges::is_permutation
ranges::search
ranges::fill
and ranges::fill_n
ranges::generate
and ranges::generate_n
ranges::search_n
ranges::is_sorted
and ranges::is_sorted_until
ranges::min
, ranges::max
, ranges::minmax
, ranges::clamp
, ranges::min_element
, ranges::max_element
, and ranges::minmax_element
ranges::lower_bound
, ranges::upper_bound
, ranges::equal_range
, and ranges::binary_search
ranges::swap_ranges
std::permutable
and std::sortable
ranges::is_heap
, ranges::is_heap_until
, ranges::make_heap
, ranges::push_heap
, ranges::pop_heap
, and ranges::sort_heap
ranges::transform
ranges::is_partitioned
, ranges::partition
, ranges::partition_copy
, and ranges::partition_point
ranges::replace
, ranges::replace_copy
, and ranges::replace_copy_if
ranges::replace_if
ranges::remove
, ranges::remove_if
, ranges::remove_copy
, and ranges::remove_copy_if
ranges::copy_backward
ranges::reverse
(vectorized like std::reverse
)ranges::unique
and ranges::unique_copy
mergeable
, and algorithms ranges::includes
, ranges::set_difference
, ranges::set_intersection
, ranges::set_symmetric_difference
, and ranges::set_union
ranges::sample
and ranges::shuffle
ranges::move_backward
ranges::nth_element
ranges::rotate
and ranges::rotate_copy
ranges::ssize
ranges::lexicographical_compare
counted_iterator
ranges::reverse_copy
(vectorized like std::reverse_copy
)ranges::next_permutation
and ranges::prev_permutation
ranges::merge
ranges::sort
ranges::ref_view
ranges::uninitialized_move
views::empty
and views::single
views::all
and views::reverse
ranges::partial_sort
and ranges::partial_sort_copy
string_view
views::filter
views::drop
and views::take
views::transform
variant
no longer emits warnings about narrowing/sign conversions when determining which alternative should be activated for a given initializer. (Warnings can still be emitted by the chosen initialization; that's intentional and desirable.) #858
condition_variable_any
now correctly unlocks-and-relocks the lock argument to timed wait functions when given a non-positive relative timeout or absolute time in the past. #685
std::pow
is now templated to handle integral and floating-point types as required by C++11 and later. For example, std::pow(float, int)
previously returned float
and now returns double
. #903
ranges::copy_n
that wasn't supposed to exist and wouldn't have compiled. #957
filesystem_error
now transcodes wide characters with no equivalent in the current locale to replacement characters instead of failing and throwing system error
. #1010
0 <=> partial_ordering::unordered
to return the correct value, and improved <compare>
codegen. #1049
discrete_distribution
no longer yields invalid results when its parameters sum very close to, but not equal to 1. #1025
move_iterator::current
is no longer inadvertently a protected
data member - it has become properly private
and been renamed. #1080
void*
. #1091
slice_array
, gslice_array
, mask_array
, and indirect_array
helpers defined in <valarray>
now have proper copy constructors and copy assignment operators. #988
ranges::iter_swap
that would cause it to sometimes drop one of the "swapped" values on the floor. #1072
weak_ptr
conversions now preserve control blocks for expired objects. #1104
<bit>
's countl_zero
to correctly use the bsr
instruction as a fallback for old CPUs that don't support the lzcnt
instruction. #1108 #1166
partial_sort_copy
to perform only operations that are required by the Standard to compile. #1088
deque::erase(iter, iter)
to no longer perform self-move-assignments when called with an empty range. #1148
coroutine_handle<>::resume
and coroutine_handle<>::operator()
to allow exceptions to be thrown from coroutines. #1182
piecewise_constant_distribution
and piecewise_linear_distribution
to return correctly distributed values. #1032
deque
(and therefore queue
and stack
) compiler errors in unusual scenarios where iter + int
and iter - int
would invoke an unexpected operator overload. #1161
any
and atomic
compiler errors when building with /Zc:noexceptTypes-
. #1150
<charconv>
hexfloat from_chars()
to correctly handle numbers like "0.fffffffffffff8p-1022"
which are just below numeric_limits<Floating>::min()
. #934
shared_ptr
's atomic functions to use SRWLOCK
instead of a naive spinlock, fixing priority inversion and improving performance. #1200
cosh()
and sinh()
. #1156
ostream << floating_point
handles precision: #1173
0
precision for scientific or general notation is directly passed to sprintf
, instead of being replaced with 6
precision.get_time()
now ignores case when parsing day and month names, as required by the Standard. #1168 #1240
<experimental/generator>
now defines an unhandled_exception()
member function, required for C++20 coroutine promise types, even when /EHs
isn't being used. #1219
counted_iterator
. #1213
fill
now works correctly with pointers-to-volatile
integral types. (This change also applies our memset
/memcmp
optimizations for fill
/equal
a bit more aggressively; they now activate for filling contiguous ranges of bool
or comparing such with contiguous ranges of single-byte integer types.) #1160
valarray::operator[]
now verifies its argument is in range when /D_CONTAINER_DEBUG_LEVEL=1
. #1247
<complex>
(introduced in VS 2019 16.7 by #367) when compiling with the Intel C++ Compiler's 80-bit long double
mode. #1316
long double
remains unsupported by MSVC.equal()
's memcmp()
optimization to ranges::equal_to
and arbitrary contiguous iterators. #831
optional
no longer unnecessarily zero-fills its storage when default constructed. #878
span
's debug codegen by simplifying its representation (as /std:c++latest
isn't ABI-frozen). #877
__iso_volatile_store64
for relaxed atomics on x86, and use __iso_volatile_store64
unconditionally. #694
constexpr
in <system_error>
using the [[msvc::noop_dtor]]
attribute we requested from the MSVC compiler front-end. #1016
std::reverse_copy
. #804
std::fill
and std::fill_n
for vector<bool>
. #879
DisableThreadLibraryCalls
to all "satellite" DLLs. #1142
<valarray>
by extracting repeated calls to size()
. Also improved readability by expanding macros, and avoided unnecessary use of magic statics for non-trivial types. #1165
vector
now avoids quadratic complexity when its size()
is near max_size()
(which is effectively impossible for the default allocator
, making this an extremely obscure scenario). Now, if geometric growth would exceed max_size()
, we clamp to max_size()
. #1221
is_function
, is_object
, is_member_function_pointer
, is_member_object_pointer
, and is_member_pointer
. #460
<charconv>
to_chars()
plain shortest round-trip. #835
std::chrono::last
. #837
span
. #839
/Zc:preprocessor
compiler option. #677
shared_ptr
of function type". #833
/MANIFEST:EMBED
. #862
inline
. #1109
deque::erase(iter, iter)
no longer performs self-move-assignments when called with an empty range. #1203
/await
from test configurations, and re-enabled various tests now that compiler bugs have been fixed. #1207
<coroutine>
"end-to-end" behavior. #1215
_R1
to _Rx1
, avoiding any resemblance to macros. #865
<execution>
, mentioning the subtle control flow. #849
stl/src
, changing C casts to C++ casts, 0
to nullptr
, and more. #900 #912
ranges::_Ubegin
and ranges::_Uend
internal helper functions to simplify getting "unwrapped" iterators from a range. #901
.hpp
and adjusted clang-format
to sort them last. #902
using _Pred
and using operator<
weren't necessary to mention. #977
using
-directives. #979
requires
, preparing for when clang-format becomes aware of concepts. #999
map
, multimap
, set
, and multiset
instead of their internal base class _Tree
. #1022
std::
qualification from product and test code. #1119
/d2Zi+
from CMakeLists.txt
. #1218
conjunction_v
for short-circuiting in conditional explicit
clauses. #1241
0
with nullptr
in a great many places. #1250
CMakeLists.txt
now defaults to using our vcpkg
submodule, simplifying our build process. #1124
test_atomic_wait.hpp
that was causing intermittent test failures./analyze
to PR/CI builds, and fixed the resulting warnings. #1009
_MSVC_STL_UPDATE
. #897 #989 #1144
constexpr
For <complex>
(Again)<bit>
bit_cast
make_shared()
For Arrays
atomic<shared_ptr<T>>
, atomic<weak_ptr<T>>
delete
For Variable Sized Classes (library support types)constexpr
For std::array
Comparisonserase()
/erase_if()
Return size_type
volatile
In The Standard Librarydisable_sized_sentinel_for
; renames disable_sized_sentinel
to disable_sized_sentinel_for
.<bit>
has_single_bit()
, bit_ceil()
, bit_floor()
, bit_width()
span
From Dynamic-Extent Rangestuple
-Like Protocol Support From Fixed-Extent span
<=>
; includes lexicographical_compare_three_way
.constexpr
Containers; includes construct_at
.ranges::equal_to
, ranges::not_equal_to
, ranges::less
, ranges::less_equal
, ranges::greater
, and ranges::greater_equal
ranges::subrange
and ranges::view_interface
reverse_iterator
to better adapt C++20 iteratorsmove_iterator
, implement move_sentinel
ranges::find_end
ranges::find_first_of
ranges::adjacent_find
atomic_flag::test
and lock-free integral types. #684
<=>
To The Library; includes concepts three_way_comparable
and three_way_comparable_with
, type trait compare_three_way_result
(with _t
variant), and function object compare_three_way
.DefaultConstructible
should require default initializationspan
's array
constructor is too strictspan::cbegin/cend
methods produce different results than std::[ranges::]cbegin/cend
totally_ordered_with
both directly and indirectly requires common_reference_with
<compare>
from most library headersmake_move_iterator()
cannot be used to construct a move_iterator
for a move-only iteratoroperator/
and operator%
for chrono::duration
now properly SFINAE away when common_type_t<Rep1, Rep2>
can't be formed. #573
<filesystem>
directory_iterator
now properly handles "."
and ".."
on network drives. #494
<filesystem>
space()
no longer requires read permissions for every directory along the path in some cases, and resolves symbolic links. #552
<filesystem>
now considers ERROR_BAD_NETPATH
as a "file does not exist" condition. #616
filesystem::path::path(const Source&)
is now properly removed from overload resolution when Source
is a non-iterator with member value_type
even in C++20 mode. #631
VCLIBS_RELEASE_OPTIONS
. #608
/clr
mode now that the fix for the compiler bug triggered by such (VSO-1006185) has been released. #417
<system_error>
and removed the _SILENCE_CLANG_CONCEPTS_MESSAGE
barrier in <concepts>
now that we've worked with Clang developers to ensure Clang 10 and the STL play well together with Concepts enabled. #622
__cpp_lib_int_pow2
is no longer incorrectly defined when the compiler lacks support for the intrinsics necessary to implement has_single_bit
, bit_ceil
, bit_floor
, and bit_width
. Also, __cpp_lib_bitops
is no longer defined when the compiler is EDG-imitating-MSVC, so IntelliSense properly reflects the non-availability of operations not yet supported by MSVC. #695
boyer_moore_searcher
by implementing a 40-year-old fix. #724
std::function
now handles over-aligned types. #698
<cvt/sjis_0208>
now correctly recognizes bad second bytes. #755
complex
's Sufficient Additional Overloads. #791
arg(real)
now behaves like arg(complex)
, instead of always returning 0
.conj(real)
now behaves like conj(complex)
, returning an imaginary part of negative zero.proj(real)
now behaves like proj(complex)
, mapping negative infinity to positive infinity.conj
and proj
now return complex
.norm
now upgrades integers to double
before squaring, instead of after.<filesystem>
now consistently handles nonexistent network paths when the Windows API emits ERROR_INVALID_NAME
. #800
adjacent_find
algorithm that could cause it to return a result other than the first under heavy load. #816
noexcept
for array
iterators, also improving the behavior of span
construction from array
iterators. #627
static_assert
in <atomic>
that prevented certain (completely conforming) usage from compiling until users defined the macro _ENABLE_ATOMIC_ALIGNMENT_FIX
. Note: MSVC's STL has generated correct code for such usage since VS 2015 Update 2, so this change doesn't degrade correctness in any way - it merely removes an annoying compilation roadblock that warned about potential ODR violations when mixing code compiled with ancient toolsets that generated incorrect code for such usage in the first place. #723
bit_cast
for IntelliSense now that front-end support is available. #733
complex
's real(T)
and imag(T)
setters now properly return void
. #367
consteval
by testing __cpp_consteval
. #765
<system_error>
by avoiding the need for synchronization when constructing error categories. #529
forward()
in invoke()
. #585
QueryPerformanceFrequency
in calls to steady_clock::now()
. #646
steady_clock::now()
. This caused a regression where steady_clock::now()
overflowed after approximately 15 minutes, so it was reverted by #972. The revert was ported to VS 2019 16.7 Preview 5, separately from the commit order in GitHub.)bitset::all
now returns upon finding the first non-set bit. #671
gcd
now uses the same machinery as countr_zero
instead of a hand-rolled bit counting loop. #665
atomic_thread_fence
now avoids unnecessary contention by using separate guard variables. #740
<algorithm>
now increments/decrements copies of iterators, which could be more efficient for certain user-defined iterators than adding/subtracting 1
. #771 #803
<mutex>
call_once
uses InitOnceBeginInitialize
and InitOnceComplete
unconditionally now that we no longer support Windows XP, and avoids trips through try
regions and std::current_exception
. #688
<array>
no longer includes <algorithm>
, <iterator>
, and <tuple>
; this is a source-breaking change for projects that weren't strict about including what they use. #482
is_invocable
family of type traits, improving throughput. #408
~scoped_lock()
now uses fold expressions, instead of helper functions in <tuple>
that weren't used by product code anywhere else. #760
_Meow{}
. #497
to_address()
is now totally constexpr
. #568
__cpp_lib_byte
to detect whether std::byte
is available. #577
_STATIC_UNLESS_PURE
with static
. (This was a macro workaround for a compiler bug that was fixed.) #584
#if 1
#endif
pair after LWG-3150 was accepted. #638
implicit conversion from '%s' to '%s', possible loss of data
. #730
for
-loops to follow the normal pattern. #709
_ITERATOR_DEBUG_ARRAY_OVERLOADS
(see #660). #735
.gitignore
. #764
_RAISE
macro. Modernized code to use {}
for index_sequence
, nullptr
, and more C++ casts. Extracted assignments before comparisons. Used unsigned int
consistently. #764
_Noinit
and removed an unnecessary struct
. #772
_STD
to system_category()
etc. calls, changed <experimental/filesystem>
error_code
handling to be consistent with Standard <filesystem>
, removed an unnecessary using
-directive in <regex>
. #827
lit
. #520
libcxx
testsuite.std
testsuite.tr1
testsuite. #652
/BE
test coverage (for EDG-powered IntelliSense). #682
/clr
test coverage (as /clr
support libraries aren't yet built). #796
VCLIBS_SUFFIX
is now a CMake cache variable. #649
_MSVC_STL_UPDATE
. #637 #676 #793
<span>
span
Usabilityspan
Comparisonsspan::size()
span
span
Should Have size_type
, Not index_type
span
's Container
constructors need another constraintspan
iterator
and const_iterator
behaviorspan
should be ill-formed where possiblespan
does not have a const_pointer
typedefstd::span::span()
<span>
span
's deduction-guide for built-in arrays doesn't workconstexpr
For <algorithm>
And exchange()
constexpr
algorithmsreference_wrapper
constexpr
For Swapping Functionsconstexpr
For pointer_traits<T*>::pointer_to()
basic_string
's operator+()
char8_t
Backward Compatibility Remediationconstexpr
For <numeric>
Algorithmsboolean
With boolean-testable
<=>
std::rel_ops
.safe_range
.ranges::all_of
, ranges::any_of
, ranges::copy
, ranges::copy_if
, ranges::copy_n
, ranges::count
, ranges::count_if
, ranges::equal
, ranges::find
, ranges::find_if
, ranges::find_if_not
, ranges::for_each
, ranges::for_each_n
, ranges::mismatch
, and ranges::none_of
.std::back_insert_iterator
, std::front_insert_iterator
, and std::insert_iterator
necessary to model the Ranges iterator concepts.complex
acos()
, acosh()
, and asinh()
now return correct results. #401
complex
pow()
is now overloaded correctly. #383
std::filesystem::remove()
on ReFS. #407
iter[idx]
in all algorithms, because it's problematic with some unusual but Standard-conforming iterators. #464
<system_error>
now maps ERROR_BROKEN_PIPE
to errc::broken_pipe
. #406
explicit
in C++14/17 mode. #424
atomic
and atomic_flag
. #315
<iterator>
and <array>
. Note that this is a source-breaking change for user code that expected STL headers to include other headers in certain ways. #355
src/syserror.cpp
now uses range-for and static_cast
. #481
constexpr
variables. #487
sort()
. #449
static_assert
is_sorted()
for lookup tables. #451
_MSVC_STL_UPDATE
. #429 #486
lit
. (Chose to use lit
.)std
and tr1
test suites.to_array()
underlying_type
bind_front()
enum class memory_order
<bit>
Rotating And Counting Functions<bit>
ispow2()
, ceil2()
, floor2()
, log2p1()
bit_length()
ceil2()
is_constant_evaluated()
<numbers>
Math Constantsvisit<R>()
istream_iterator
Cleanupis_pod
string::reserve()
Should Not Shrinkerase_if()
, erase()
std::ssize()
is_bounded_array
, is_unbounded_array
endian
To <bit>
weak_equality
And strong_equality
is_(nothrow_)move_constructible
and tuple
, optional
, and unique_ptr
tuple(allocator_arg_t, const Alloc&)
should be conditionally explicitistream >> bitset<0>
failsto_chars(bool)
should be deletedswap(unique_ptr&, unique_ptr&)
which was mistakenly removed. #170
vector
, avoided self-move-assigning all elements. #228
noexcept
that was incorrectly applied to an allocating helper function in list
. #77
valarray
now uses argument-dependent lookup when calling sin()
, cos()
, pow()
, sqrt()
, etc. as required by the Standard. #286
<filesystem>
linker errors for UWP developers. #356
locale
's assignment operator to const locale&
as (perhaps surprisingly) required by the Standard. #324
regex_token_iterator
to return correct results. #131
begin()
and end()
now take basic_string_view
by value as required by the Standard. #119
list::splice()
to work correctly when splicing exactly half of one list
into another. #129
atomic<integral>
and atomic<pointer>
. #227
msvcp140.dll
from 588 KB to 528 KB. #154
list
and forward_list
insertion. #366
atomic
loads on x86. #87
if constexpr
instead of tag dispatch in <any>
. #173
function<Ret (Args) noexcept>
. #350
any
now supports over-aligned types. #173
noexcept
for exchange()
. #364
std::function
now avoids using typeid(void)
in our _HAS_STATIC_RTTI=0
mode, for compatibility with Clang's -fno-rtti
mode. #375
<experimental/coroutine>
, <experimental/generator>
, and <experimental/resumable>
headers aren't supported with Clang. #136
public
keywords in struct
inheritance. #219
iter[idx]
for clarity in <algorithm>
. #289 (Note that this was reverted in VS 2019 16.6 by #464.)virtual
member functions as override
. #302
int = 0
SFINAE technique. #226 #244 #328
invoke()
's implementation. #368
_MSVC_STL_UPDATE
. #253 #358