Visual Studio “15” Preview 5 is now available. (As our previous changelog explained, VS “15” is an IDE version number, not a year. It’s the next major version after VS 2015, which was IDE version 14. VS has different numbers for its year branding, IDE version, and C++ compiler version.)
Preview 5 adds support for C++14 extended constexpr, unconditional support for generalized range-for (it’s a C++17 change that’s been determined to fix a defect in C++14), and support for C++17’s terse static_assert, shared_ptr::weak_type, <optional>, and <variant>. As usual, we’ve fixed many compiler bugs and library bugs, and we’ve resolved 10 more Library Issues.
Additionally, the VS “15” Release Candidate will add support for C++17’s <any>, <string_view>, apply(), and make_from_tuple(). It will also contain a major overhaul of std::vector for correctness and performance. While we’re still working on releasing VS “15” RC, you can try our daily toolset builds right now. Please report any bugs you find, in either Preview 5 or the daily toolset builds.
Compiler Features
C++03/11 Core Language Features |
VS “15” |
Notes |
[Everything else] |
Yes |
[A] |
Two-phase name lookup |
No |
|
Partial |
[B] |
|
Partial |
[C] |
|
N/A |
[D] |
|
C++14 Core Language Features |
VS “15” |
Notes |
N/A |
[E] |
|
Yes |
||
Yes |
||
Yes |
||
Yes |
||
Yes |
||
Yes |
||
Yes |
[P5] |
|
Yes |
[P4] |
|
Yes |
||
Yes |
||
Yes |
||
C++17 Core Language Features |
VS “15” |
Notes |
Yes |
||
Yes |
[P5] [*] |
|
Yes |
||
Yes |
||
Yes |
[*] |
|
No |
||
Yes |
||
Yes |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
Yes |
[P5] |
|
Yes |
[P4] [*] |
|
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
||
No |
[A] This is deliberately ignoring C++03’s dynamic exception specifications, which were deprecated in C++11. We aren’t planning to implement them, and hopefully they’ll be removed from a future C++ Standard.
[B] The compiler’s support for Expression SFINAE is continuing to improve (and has been sufficient for the STL since VS 2015 Update 2), but remains Partial. We’ll publish a detailed blog post about this in the near future.
[C] The compiler’s support for C99 Preprocessor rules remains Partial. Variadic macros are supported, but there are many bugs in the preprocessor’s behavior. We’ll overhaul the preprocessor before marking this as Yes.
[D] This is marked as Not Applicable because compilers are permitted, but not required, to support extended integer types. Like GCC and Clang, we’ve chosen not to support them.
[E] Similarly, this is marked as Not Applicable because compilers are permitted, but not required, to implement this optimization.
[P4] Implemented in VS “15” Preview 4.
[P5] Implemented in VS “15” Preview 5.
[*] These features are guarded by the /std:c++latest compiler option.
STL Features
Status |
Std |
Paper |
Title |
missing |
C++17 |
has_unique_object_representations |
|
missing |
C++17 |
C11 Standard Library |
|
missing |
C++17 |
hypot(x, y, z) |
|
missing |
C++17 |
Rewording enable_shared_from_this |
|
… |
C++17 |
Library Fundamentals V1 |
|
missing |
C++17 |
… |
<memory> shared_ptr<T[]>, shared_ptr<T[N]> |
missing |
C++17 |
Emplace Return Type |
|
missing |
C++17 |
Splicing Maps And Sets |
|
missing |
C++17 |
constexpr For <array> (Again) And <iterator> |
|
missing |
C++17 |
atomic::is_always_lock_free |
|
missing |
C++17 |
not_fn() |
|
patch |
C++17 |
Fixes For not_fn() |
|
missing |
C++17 |
gcd(), lcm() |
|
missing |
C++17 |
hardware_destructive_interference_size, etc. |
|
missing |
C++17 |
Elementary String Conversions |
|
missing |
C++17 |
… |
<algorithm>/<functional> Boyer-Moore search() |
patch |
C++17 |
Fixing Searcher Return Types |
|
missing |
C++17 |
Deprecating Vestigial Library Parts |
|
missing |
C++17 |
Removing Allocator Support In std::function |
|
missing |
C++17 |
Extending Memory Management Tools |
|
missing |
C++17 |
… |
<memory_resource> |
patch |
C++17 |
Deleting polymorphic_allocator Assignment |
|
missing |
C++17 |
Parallel Algorithms |
|
patch |
C++17 |
Renaming Parallel Execution Policies |
|
patch |
C++17 |
Parallel Algorithms Should terminate() For Exceptions |
|
missing |
C++17 |
Mathematical Special Functions |
|
missing |
C++17 |
<filesystem> |
|
patch |
C++17 |
Relative Paths For Filesystem |
|
patch |
C++17 |
Supporting string_view In Filesystem Paths |
|
doomed |
C++17 |
Ordered By Default |
|
RC |
C++17 |
… |
<any> |
RC |
C++17 |
… |
<string_view> |
RC |
C++17 |
… |
<tuple> apply() |
RC |
C++17 |
make_from_tuple() |
|
RC |
C++17 |
Integrating string_view And std::string |
|
Preview 5 |
C++17 |
… |
<optional> |
Preview 5 |
C++17 |
Homogeneous Interface For variant/any/optional |
|
Preview 5 |
C++17 |
<variant> |
|
Preview 5 |
C++17 |
shared_ptr::weak_type |
|
Preview 5 |
C++17 |
Making Optional Greater Equal Again |
|
Preview 5 |
C++17 |
Making Variant Greater Equal |
|
Preview 4 |
C++17 |
… |
<algorithm> sample() |
Preview 4 |
C++17 |
is_callable, is_nothrow_callable |
|
Update 3 |
C++17 |
clamp() |
|
Update 3 |
C++17 |
is_swappable, is_nothrow_swappable |
|
Update 3 |
C++17 |
Non-const basic_string::data() |
|
Update 2 |
C++14 |
SFINAE-Friendly result_of |
|
Update 2 |
C++17 |
Improving pair And tuple |
|
Up2 Win7+ |
C++17 |
shared_mutex (Untimed) |
|
Up2 opt-in |
C++17 |
Removing Deprecated Iostreams Aliases |
|
Update 2 |
C++17 |
Variable Templates For Type Traits (is_same_v, etc.) |
|
Update 2 |
C++17 |
as_const() |
|
Update 2 |
C++17 |
Logical Operator Type Traits (conjunction, etc.) |
|
Update 2 |
C++17 |
owner_less<> |
|
Update 2 |
C++17 |
<chrono> floor(), ceil(), round(), abs() |
|
Update 2 |
C++17 |
Variadic lock_guard |
|
VS 2015 |
C++14 |
constexpr For <complex> |
|
VS 2015 |
C++14 |
constexpr For <chrono> |
|
VS 2015 |
C++14 |
constexpr For <array> |
|
VS 2015 |
C++14 |
constexpr For <initializer_list>, <tuple>, <utility> |
|
VS 2015 |
C++14 |
integral_constant::operator()() |
|
VS 2015 |
C++14 |
UDLs For <chrono>, <string> (1729ms, “meow”s, etc.) |
|
VS 2015 |
C++14 |
Null Forward Iterators |
|
VS 2015 |
C++14 |
quoted() |
|
VS 2015 |
C++14 |
Heterogeneous Associative Lookup |
|
VS 2015 |
C++14 |
integer_sequence |
|
VS 2015 |
C++14 |
shared_mutex (Timed) |
|
VS 2015 |
C++14 |
exchange() |
|
VS 2015 |
C++14 |
Fixing constexpr Member Functions Without const |
|
VS 2015 |
C++14 |
get<T>() |
|
VS 2015 |
C++14 |
Dual-Range equal(), is_permutation(), mismatch() |
|
VS 2015 |
C++14 |
Sized Deallocation |
|
VS 2015 |
C++14 |
UDLs For <complex> (3.14i, etc.) |
|
VS 2015 |
C++14 |
constexpr For <functional> |
|
VS 2015 |
C++14 |
tuple_element_t |
|
VS 2015 |
C++14 |
Renaming shared_mutex (Timed) To shared_timed_mutex |
|
VS 2015 |
C++17 |
void_t |
|
VS 2015 |
C++17 |
Safe Conversions In unique_ptr<T[]> |
|
VS 2015 |
C++17 |
invoke() |
|
2015 opt-in |
C++17 |
Removing auto_ptr, random_shuffle(), And Old <functional> Stuff |
|
VS 2015 |
C++17 |
noexcept Cleanups |
|
VS 2015 |
C++17 |
uncaught_exceptions() |
|
VS 2015 |
C++17 |
Trivially Copyable reference_wrapper |
|
VS 2015 |
C++17 |
insert_or_assign()/try_emplace() For map/unordered_map |
|
VS 2015 |
C++17 |
size(), empty(), data() |
|
VS 2015 |
C++17 |
Precisely Constraining unique_ptr Assignment |
|
VS 2015 |
C++17 |
bool_constant |
|
VS 2013 |
C++14 |
Minimal Container Element Requirements |
|
VS 2013 |
C++14 |
Transparent Operator Functors (less<>, etc.) |
|
VS 2013 |
C++14 |
Alias Templates For <type_traits> (decay_t, etc.) |
|
VS 2013 |
C++14 |
make_unique() |
|
VS 2013 |
C++17 |
Supporting Incomplete Types In vector/list/forward_list |
|
N/A |
C++14 |
Discouraging rand() |
|
N/A |
C++17 |
Contiguous Iterators |
|
N/A |
C++17 |
Synopses For The C Library |
|
N/A |
C++17 |
Reserving Namespaces For Future Standardization |
|
N/A |
C++17 |
A <random> Nomenclature Tweak |
|
N/A |
C++17 |
Discouraging memory_order_consume |
This table is somewhat complicated; we use it to track our work, so it has to be detailed enough to tell us what to do.
“…” indicates where the Library Fundamentals V1 paper has been decomposed into its individual features.
“missing” means not yet implemented. We’re working on it! We were fully caught up in January, but then more features got voted in.
“patch” indicates where a feature was voted in, and then a paper fixing that feature somehow was also voted in. We’ll implement them together, so they don’t really represent any additional work for us to do. (Each patch is grouped below its affected feature.)
“doomed” indicates that the Ordered By Default feature has been found to break ABI compatibility (in other compilers), will not be implemented by any vendor, and will be removed from C++17.
“N/A” papers aren’t actually features – they altered Standardese, but didn’t create any work for implementers. They’re listed for completeness.
“VS 2013” indicates features that were supported long, long ago, in a compiler far, far away.
“VS 2015” indicates features that were supported in VS 2015 RTM.
“Update 2” and “Update 3” refer to VS 2015.
“Preview 4” and “Preview 5” refer to VS “15”.
“RC” indicates features that have been checked into VS “15”, but not in time for the Preview 5 build. They’ll be available in the Release Candidate build.
Note that while we’ve implemented the Filesystem TS (and for historical reasons we’re providing it as both <experimental/filesystem> and <filesystem>), we need to overhaul its implementation before moving around its namespace and marking the Standard feature as implemented.
STL Fixes in VS “15” Preview 5
Fixed silent bad codegen for stateful user-defined allocators requesting propagate_on_container_copy_assignment and propagate_on_container_move_assignment.
Added <cstdalign>.
Improved weak_ptr::lock() performance.
Fixed std::promise’s move assignment operator, which previously could cause code to block forever (VSO#243880/Connect#2972781).
Fixed compiler errors with atomic<T *>’s implicit conversion to T * (VSO#257598).
pointer_traits<Ptr> now correctly detects Ptr::rebind<U>.
Fixed a missing const qualifier in move_iterator’s subtraction operator.
atomic<T> now tolerates overloaded operator&() (VSO#198738).
Slightly improved compiler diagnostics for incorrect bind() calls (VSO#246001, reddit)
Simplified unique_ptr::operator->() (VSO#239517/Connect#2918170).
Changed the container adaptors to have implicitly defined copy/move constructors (VSO#234651).
To increase compiler throughput, STL headers now avoid including declarations for unnecessary compiler intrinsics (VSO#221287, requested by Clang and Chromium devs). This is inherently a source breaking change. If your code was assuming that <vector> or other STL headers drag in <intrin.h>, the mega-header providing declarations of compiler intrinsics, this assumption has been broken. Now we include a sub-header with just the intrinsics that we need to make shared_ptr and atomic work. If you encounter compiler errors, the fix is simple: include <intrin.h> directly.
Library Issues
Status |
Std |
Title |
|
missing |
C++17 |
LWG 1169 |
num_get not fully compatible with strto* |
missing |
C++17 |
LWG 2059 |
C++0x ambiguity problem with map::erase |
missing |
C++17 |
LWG 2156 |
Unordered containers’ reserve(n) reserves for n-1 elements |
missing |
C++17 |
LWG 2408 |
SFINAE-friendly common_type / iterator_traits is missing in C++14 |
missing |
C++17 |
LWG 2415 |
Inconsistency between unique_ptr and shared_ptr |
missing |
C++17 |
LWG 2422 |
std::numeric_limits<T>::is_modulo description: “most machines” errata |
missing |
C++17 |
LWG 2436 |
Comparators for associative containers should always be CopyConstructible |
missing |
C++17 |
LWG 2724 |
The protected virtual member functions of memory_resource should be private |
filesystem |
C++17 |
LWG 2667 |
path::root_directory() description is confusing |
filesystem |
C++17 |
LWG 2669 |
recursive_directory_iterator effects refers to non-existent functions |
filesystem |
C++17 |
LWG 2670 |
system_complete refers to undefined variable ‘base’ |
filesystem |
C++17 |
LWG 2671 |
Errors in Copy |
filesystem |
C++17 |
LWG 2673 |
status() effects cannot be implemented as specified |
filesystem |
C++17 |
LWG 2674 |
Bidirectional iterator requirement on path::iterator is very expensive |
filesystem |
C++17 |
LWG 2683 |
filesystem::copy() says “no effects” |
filesystem |
C++17 |
LWG 2704 |
recursive_directory_iterator’s members should require ‘*this is dereferenceable’ |
filesystem |
C++17 |
LWG 2706 |
Error reporting for recursive_directory_iterator::pop() is under-specified |
filesystem |
C++17 |
LWG 2707 |
path construction and assignment should have “string_type&&” overloads |
filesystem |
C++17 |
LWG 2711 |
path is convertible from approximately everything under the sun |
filesystem |
C++17 |
LWG 2720 |
permissions function incorrectly specified for symlinks |
filesystem |
C++17 |
LWG 2721 |
remove_all has incorrect post conditions |
filesystem |
C++17 |
LWG 2723 |
Do directory_iterator and recursive_directory_iterator become the end iterator upon error? |
filesystem |
C++17 |
LWG 2725 |
filesystem::exists(const path&, error_code&) error reporting |
filesystem |
C++17 |
LWG 2726 |
[recursive_]directory_iterator::increment(error_code&) is underspecified |
filesystem |
C++17 |
LWG 2728 |
status(p).permissions() and symlink_status(p).permissions() are not specified |
parallel |
C++17 |
LWG 2687 |
{inclusive,exclusive}_scan misspecified |
parallel |
C++17 |
LWG 2689 |
Parallel versions of std::copy and std::move shouldn’t be in order |
parallel |
C++17 |
LWG 2727 |
Parallel algorithms with constexpr specifier |
WCFB02 |
C++14 |
LWG 2140 |
notify_all_at_thread_exit synchronization |
WCFB02 |
C++17 |
LWG 2309 |
mutex::lock() should not throw device_or_resource_busy |
RTM |
New |
LWG 2769 |
Redundant const in the return type of any_cast(const any&) |
RC |
C++14 |
LWG 2252 |
Strong guarantee on vector::push_back() still broken with C++11? |
RC |
New |
LWG 2509 |
[fund.ts.v2] any_cast doesn’t work with rvalue reference targets and cannot move with a value target |
RC |
New |
LWG 2744 |
any’s in_place constructors |
RC |
New |
LWG 2746 |
Inconsistency between requirements for emplace between optional and variant |
RC |
New |
LWG 2754 |
The in_place constructors and emplace functions added by P0032R3 don’t require CopyConstructible |
Preview 5 |
C++14 |
LWG 2350 |
min, max, and minmax should be constexpr |
Preview 5 |
C++17 |
LWG 2192 |
Validity and return type of std::abs(0u) is unclear |
Preview 5 |
C++17 |
LWG 2276 |
Missing requirement on std::promise::set_exception |
Preview 5 |
C++17 |
LWG 2328 |
Rvalue stream extraction should use perfect forwarding |
Preview 5 |
C++17 |
LWG 2369 |
constexpr max(initializer_list) vs max_element |
Preview 5 |
C++17 |
LWG 2485 |
get() should be overloaded for const tuple&& |
Preview 5 |
C++17 |
LWG 2520 |
N4089 broke initializing unique_ptr<T[]> from a nullptr |
Preview 5 |
C++17 |
LWG 2719 |
permissions function should not be noexcept due to narrow contract |
Preview 5 |
New |
LWG 2713 |
More missing allocator-extended constructors for unordered containers |
Preview 5 |
New |
LWG 2756 |
C++ WP optional<T> should ‘forward’ T’s implicit conversions |
Preview 4 |
C++14 |
LWG 2135 |
Unclear requirement for exceptions thrown in condition_variable::wait() |
Preview 4 |
C++14 |
LWG 2203 |
scoped_allocator_adaptor uses wrong argument types for piecewise construction |
Preview 4 |
C++14 |
LWG 2210 |
Missing allocator-extended constructor for allocator-aware containers |
Preview 4 |
C++17 |
LWG 2063 |
Contradictory requirements for string move assignment |
Preview 4 |
C++17 |
LWG 2219 |
INVOKE-ing a pointer to member with a reference_wrapper as the object expression |
Preview 4 |
C++17 |
LWG 2439 |
unique_copy() sometimes can’t fall back to reading its output |
Preview 4 |
C++17 |
LWG 2476 |
scoped_allocator_adaptor is not assignable |
Preview 4 |
C++17 |
LWG 2566 |
Requirements on the first template parameter of container adaptors |
Preview 4 |
C++17 |
LWG 2576 |
istream_iterator and ostream_iterator should use std::addressof |
Preview 4 |
C++17 |
LWG 2577 |
{shared,unique}_lock should use std::addressof |
Preview 4 |
C++17 |
LWG 2579 |
Inconsistency wrt Allocators in basic_string assignment vs. basic_string::assign |
Preview 4 |
C++17 |
LWG 2583 |
There is no way to supply an allocator for basic_string(str, pos) |
Preview 4 |
C++17 |
LWG 2586 |
Wrong value category used in scoped_allocator_adaptor::construct() |
Preview 4 |
C++17 |
LWG 2684 |
priority_queue lacking comparator typedef |
Preview 4 |
C++17 |
LWG 2716 |
Specification of shuffle and sample disallows lvalue URNGs |
Update 3 |
C++14 |
LWG 2064 |
More noexcept issues in basic_string |
Update 3 |
C++17 |
LWG 2296 |
std::addressof should be constexpr |
Update 3 |
C++17 |
LWG 2596 |
vector::data() should use addressof |
Update 3 |
C++17 |
LWG 2688 |
clamp misses preconditions and has extraneous condition on result |
Update 2 |
C++14 |
LWG 2005 |
unordered_map::insert(T&&) protection should apply to map too |
Update 2 |
C++14 |
LWG 2021 |
Further incorrect usages of result_of |
Update 2 |
C++14 |
LWG 2132 |
std::function ambiguity |
Update 2 |
C++14 |
LWG 2196 |
Specification of is_*[copy/move]_[constructible/assignable] unclear for non-referencable types |
Update 2 |
C++17 |
LWG 2101 |
Some transformation types can produce impossible types |
Update 2 |
C++17 |
LWG 2106 |
move_iterator wrapping iterators returning prvalues |
Update 2 |
C++17 |
LWG 2127 |
Move-construction with raw_storage_iterator |
Update 2 |
C++17 |
LWG 2217 |
operator==(sub_match, string) slices on embedded ‘\0’s |
Update 2 |
C++17 |
LWG 2312 |
tuple’s constructor constraints need to be phrased more precisely |
Update 2 |
C++17 |
LWG 2353 |
std::next is over-constrained |
Update 2 |
C++17 |
LWG 2354 |
Unnecessary copying when inserting into maps with braced-init syntax |
Update 2 |
C++17 |
LWG 2367 |
pair and tuple are not correctly implemented for is_constructible with no args |
Up2 opt-in |
C++17 |
LWG 2385 |
function::assign allocator argument doesn’t make sense |
Update 2 |
C++17 |
LWG 2393 |
std::function’s Callable definition is broken |
Update 2 |
C++17 |
LWG 2455 |
Allocator default construction should be allowed to throw |
Update 2 |
C++17 |
LWG 2466 |
allocator_traits::max_size() default behavior is incorrect |
Update 2 |
C++17 |
LWG 2469 |
Wrong specification of Requires clause of operator[] for map and unordered_map |
Update 2 |
C++17 |
LWG 2549 |
Tuple EXPLICIT constructor templates […] will create dangling references |
VS 2015 |
C++14 |
GB 9 |
Remove gets from C++14 |
VS 2015 |
C++14 |
LWG 2009 |
Reporting out-of-bound values on numeric string conversions |
VS 2015 |
C++14 |
LWG 2078 |
Throw specification of async() incomplete |
VS 2015 |
C++14 |
LWG 2094 |
duration conversion overflow shouldn’t participate in overload resolution |
VS 2015 |
C++14 |
LWG 2097 |
packaged_task constructors should be constrained |
VS 2015 |
C++14 |
LWG 2103 |
std::allocator_traits<std::allocator<T>>::propagate_on_container_move_assignment |
VS 2015 |
C++14 |
LWG 2104 |
unique_lock move-assignment should not be noexcept |
VS 2015 |
C++14 |
LWG 2112 |
User-defined classes that cannot be derived from |
VS 2015 |
C++14 |
LWG 2144 |
Missing noexcept specification in type_index |
VS 2015 |
C++14 |
LWG 2145 |
error_category default constructor |
VS 2015 |
C++14 |
LWG 2162 |
allocator_traits::max_size missing noexcept |
VS 2015 |
C++14 |
LWG 2174 |
wstring_convert::converted() should be noexcept |
VS 2015 |
C++14 |
LWG 2176 |
Special members for wstring_convert and wbuffer_convert |
VS 2015 |
C++14 |
LWG 2187 |
vector<bool> is missing emplace and emplace_back member functions |
VS 2015 |
C++14 |
LWG 2193 |
Default constructors for standard library containers are explicit |
VS 2015 |
C++14 |
LWG 2247 |
Type traits and std::nullptr_t |
VS 2015 |
C++14 |
LWG 2268 |
Setting a default argument in the declaration of a member function assign of std::basic_string |
VS 2015 |
C++14 |
LWG 2272 |
quoted should use char_traits::eq for character comparison |
VS 2015 |
C++14 |
LWG 2275 |
Why is forward_as_tuple not constexpr? |
VS 2015 |
C++14 |
LWG 2278 |
User-defined literals for Standard Library types |
VS 2015 |
C++14 |
LWG 2280 |
begin / end for arrays should be constexpr and noexcept |
VS 2015 |
C++14 |
LWG 2285 |
make_reverse_iterator |
VS 2015 |
C++14 |
LWG 2301 |
Why is std::tie not constexpr? |
VS 2015 |
C++14 |
LWG 2306 |
match_results::reference should be value_type&, not const value_type& |
VS 2015 |
C++14 |
LWG 2315 |
weak_ptr should be movable |
VS 2015 |
C++14 |
LWG 2324 |
Insert iterator constructors should use addressof() |
VS 2015 |
C++14 |
LWG 2329 |
regex_match()/regex_search() with match_results should forbid temporary strings |
VS 2015 |
C++14 |
LWG 2332 |
regex_iterator/regex_token_iterator should forbid temporary regexes |
VS 2015 |
C++14 |
LWG 2339 |
Wording issue in nth_element |
VS 2015 |
C++14 |
LWG 2344 |
quoted()’s interaction with padding is unclear |
VS 2015 |
C++14 |
LWG 2346 |
integral_constant’s member functions should be marked noexcept |
VS 2015 |
C++17 |
LWG 2129 |
User specializations of std::initializer_list |
VS 2015 |
C++17 |
LWG 2133 |
Attitude to overloaded comma for iterators |
VS 2015 |
C++17 |
LWG 2212 |
tuple_size for const pair request header |
VS 2015 |
C++17 |
LWG 2234 |
assert() should allow usage in constant expressions |
VS 2015 |
C++17 |
LWG 2365 |
Missing noexcept in shared_ptr::shared_ptr(nullptr_t) |
VS 2015 |
C++17 |
LWG 2399 |
shared_ptr’s constructor from unique_ptr should be constrained |
VS 2015 |
C++17 |
LWG 2400 |
shared_ptr’s get_deleter() should use addressof() |
VS 2015 |
C++17 |
LWG 2401 |
std::function needs more noexcept |
VS 2015 |
C++17 |
LWG 2403 |
stof() should call strtof() and wcstof() |
VS 2015 |
C++17 |
LWG 2407 |
packaged_task(allocator_arg_t, const Allocator&, F&&) should neither be constrained nor explicit |
VS 2015 |
C++17 |
LWG 2420 |
function<void(ArgTypes…)> does not discard the return value of the target object |
VS 2015 |
C++17 |
LWG 2426 |
Issue about compare_exchange |
VS 2015 |
C++17 |
LWG 2433 |
uninitialized_copy()/etc. should tolerate overloaded operator& |
VS 2015 |
C++17 |
LWG 2440 |
seed_seq::size() should be noexcept |
VS 2015 |
C++17 |
LWG 2442 |
call_once() shouldn’t DECAY_COPY() |
VS 2015 |
C++17 |
LWG 2454 |
Add raw_storage_iterator::base() member |
VS 2015 |
C++17 |
LWG 2458 |
N3778 and new library deallocation signatures |
VS 2015 |
C++17 |
LWG 2464 |
try_emplace and insert_or_assign misspecified |
VS 2015 |
C++17 |
LWG 2467 |
is_always_equal has slightly inconsistent default |
VS 2015 |
C++17 |
LWG 2483 |
throw_with_nested() should use is_final |
VS 2015 |
C++17 |
LWG 2484 |
rethrow_if_nested() is doubly unimplementable |
VS 2015 |
C++17 |
LWG 2486 |
mem_fn() should be required to use perfect forwarding |
VS 2015 |
C++17 |
LWG 2487 |
bind() should be const-overloaded, not cv-overloaded |
VS 2015 |
C++17 |
LWG 2488 |
Placeholders should be allowed and encouraged to be constexpr |
VS 2015 |
C++17 |
LWG 2489 |
mem_fn() should be noexcept |
VS 2013 |
C++14 |
LWG 1214 |
Insufficient/inconsistent key immutability requirements for associative containers |
VS 2013 |
C++14 |
LWG 2011 |
Unexpected output required of strings |
VS 2013 |
C++14 |
LWG 2018 |
regex_traits::isctype Returns clause is wrong |
VS 2013 |
C++14 |
LWG 2033 |
Preconditions of reserve, shrink_to_fit, and resize functions |
VS 2013 |
C++14 |
LWG 2039 |
Issues with std::reverse and std::copy_if |
VS 2013 |
C++14 |
LWG 2047 |
Incorrect “mixed” move-assignment semantics of unique_ptr |
VS 2013 |
C++14 |
LWG 2049 |
is_destructible is underspecified |
VS 2013 |
C++14 |
LWG 2050 |
Unordered associative containers do not use allocator_traits to define member types |
VS 2013 |
C++14 |
LWG 2056 |
future_errc enums start with value 0 (invalid value for broken_promise) |
VS 2013 |
C++14 |
LWG 2061 |
make_move_iterator and arrays |
VS 2013 |
C++14 |
LWG 2067 |
packaged_task should have deleted copy c’tor with const parameter |
VS 2013 |
C++14 |
LWG 2074 |
Off by one error in std::reverse_copy |
VS 2013 |
C++14 |
LWG 2083 |
const-qualification on weak_ptr::owner_before |
VS 2013 |
C++14 |
LWG 2087 |
iostream_category() and noexcept |
VS 2013 |
C++14 |
LWG 2096 |
Incorrect constraints of future::get in regard to MoveAssignable |
VS 2013 |
C++14 |
LWG 2128 |
Absence of global functions cbegin/cend |
VS 2013 |
C++14 |
LWG 2138 |
atomic_flag::clear ordering constraints |
VS 2013 |
C++14 |
LWG 2141 |
common_type trait produces reference types |
VS 2013 |
C++14 |
LWG 2143 |
ios_base::xalloc should be thread-safe |
VS 2013 |
C++14 |
LWG 2148 |
Hashing enums should be supported directly by std::hash |
VS 2013 |
C++14 |
LWG 2188 |
Reverse iterator does not fully support targets that overload operator& |
VS 2013 |
C++14 |
LWG 2197 |
Specification of is_[un]signed unclear for non-arithmetic types |
VS 2013 |
C++14 |
LWG 2213 |
Return value of std::regex_replace |
VS 2013 |
C++14 |
LWG 2229 |
Standard code conversion facets underspecified |
VS 2013 |
C++14 |
LWG 2284 |
Inconsistency in allocator_traits::max_size |
VS 2013 |
C++14 |
LWG 2293 |
Wrong facet used by num_put::do_put |
VS 2013 |
C++14 |
LWG 2313 |
tuple_size should always derive from integral_constant |
VS 2013 |
C++14 |
LWG 2317 |
The type property queries should be UnaryTypeTraits returning size_t |
VS 2013 |
C++14 |
LWG 2330 |
regex(“meow”, regex::icase) is technically forbidden but should be permitted |
VS 2013 |
C++14 |
LWG 2341 |
Inconsistency between basic_ostream::seekp(pos) and basic_ostream::seekp(off, dir) |
VS 2013 |
C++14 |
LWG 2359 |
How does regex_constants::nosubs affect basic_regex::mark_count()? |
VS 2013 |
C++14 |
LWG 2360 |
reverse_iterator::operator*() is unimplementable |
VS 2013 |
C++17 |
LWG 2244 |
Issue on basic_istream::seekg |
VS 2013 |
C++17 |
LWG 2273 |
regex_match ambiguity |
VS 2013 |
C++17 |
LWG 2441 |
Exact-width atomic typedefs should be provided |
VS 2013 |
C++17 |
LWG 2473 |
basic_filebuf’s relation to C FILE semantics |
VS 2013 |
C++17 |
LWG 2537 |
Constructors for priority_queue taking allocators should call make_heap |
VS 2013 |
C++17 |
LWG 2560 |
is_constructible underspecified when applied to a function type |
This table is enormous, even after omitting 146 N/A issues. The Library Working Group fixes a lot of bugs in the Standard.
“New” indicates issues which haven’t actually been resolved in C++17 yet. We felt that these issues had to be dealt with before shipping the affected feature, and we expect that our implemented resolution will be accepted.
“RTM” indicates an issue which has been fixed for the official release of VS “15”, but not in time for the Release Candidate build.
“WCFB02” indicates issues that will be fixed in a future, binary-incompatible release of the STL (but not the STL shipping in VS “15”).
“filesystem” indicates issues affecting <filesystem>, which we’ll be analyzing when we overhaul that feature’s implementation.
“parallel” indicates issues affecting the Parallel Algorithms feature, which we haven’t yet implemented.
Note that we’ve implemented all C++14 STL features (result_of SFINAE in VS 2015 Update 2 was the last one) and all C++14 Library Issues. Excluding LWG 2140 (which had to be fixed outside of VS “15” due to bincompat), the last Library Issue was LWG 2252, fixed by a major overhaul of std::vector in VS “15” RC. We’ll publish more details about that in the near future.
Two issues here are notable. LWG 2350 and LWG 2369, implemented in Preview 5, mean that we’ve enabled C++14 constexpr in min/max/minmax(initializer_list) and min_element/max_element/minmax_element(). However, while this is supported by our codegen compilers (C1XX and Clang), this is not yet supported by our Intellisense compiler (EDG). We’re working on fixing this.
Billy Robert O’Neal III – @MalwareMinigun – bion@microsoft.com
Casey Carter – @CoderCasey – cacarter@microsoft.com
Stephan T. Lavavej – @StephanTLavavej – stl@microsoft.com
0 comments