C++14/17 Features and STL Fixes in VS “15” Preview 5

October 11th, 2016

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

[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 P0258R2 has_unique_object_representations missing C++17 P0063R3 C11 Standard Library missing C++17 P0030R1 hypot(x, y, z) missing C++17 P0033R1 Rewording enable_shared_from_this … C++17 P0220R1 Library Fundamentals V1 missing C++17 … <memory> shared_ptr<T[]>, shared_ptr<T[N]> missing C++17 P0084R2 Emplace Return Type missing C++17 P0083R3 Splicing Maps And Sets missing C++17 P0031R0 constexpr For <array> (Again) And <iterator> missing C++17 P0152R1 atomic::is_always_lock_free missing C++17 P0005R4 not_fn() patch C++17 P0358R1 Fixes For not_fn() missing C++17 P0295R0 gcd(), lcm() missing C++17 P0154R1 hardware_destructive_interference_size, etc. missing C++17 P0067R3 Elementary String Conversions missing C++17 … <algorithm>/<functional> Boyer-Moore search() patch C++17 P0253R1 Fixing Searcher Return Types missing C++17 P0174R2 Deprecating Vestigial Library Parts missing C++17 P0302R1 Removing Allocator Support In std::function missing C++17 P0040R3 Extending Memory Management Tools missing C++17 … <memory_resource> patch C++17 P0337R0 Deleting polymorphic_allocator Assignment missing C++17 P0024R2 Parallel Algorithms patch C++17 P0336R1 Renaming Parallel Execution Policies patch C++17 P0394R4 Parallel Algorithms Should terminate() For Exceptions missing C++17 P0226R1 Mathematical Special Functions missing C++17 P0218R1 <filesystem> patch C++17 P0219R1 Relative Paths For Filesystem patch C++17 P0392R0 Supporting string_view In Filesystem Paths doomed C++17 P0181R1 Ordered By Default RC C++17 … <any> RC C++17 … <string_view> RC C++17 … <tuple> apply() RC C++17 P0209R2 make_from_tuple() RC C++17 P0254R2 Integrating string_view And std::string Preview 5 C++17 … <optional> Preview 5 C++17 P0032R3 Homogeneous Interface For variant/any/optional Preview 5 C++17 P0088R3 <variant> Preview 5 C++17 P0163R0 shared_ptr::weak_type Preview 5 C++17 P0307R2 Making Optional Greater Equal Again Preview 5 C++17 P0393R3 Making Variant Greater Equal Preview 4 C++17 … <algorithm> sample() Preview 4 C++17 P0077R2 is_callable, is_nothrow_callable Update 3 C++17 P0025R1 clamp() Update 3 C++17 P0185R1 is_swappable, is_nothrow_swappable Update 3 C++17 P0272R1 Non-const basic_string::data() Update 2 C++14 N3462 SFINAE-Friendly result_of Update 2 C++17 N4387 Improving pair And tuple Up2 Win7+ C++17 N4508 shared_mutex (Untimed) Up2 opt-in C++17 P0004R1 Removing Deprecated Iostreams Aliases Update 2 C++17 P0006R0 Variable Templates For Type Traits (is_same_v, etc.) Update 2 C++17 P0007R1 as_const() Update 2 C++17 P0013R1 Logical Operator Type Traits (conjunction, etc.) Update 2 C++17 P0074R0 owner_less<> Update 2 C++17 P0092R1 <chrono> floor(), ceil(), round(), abs() Update 2 C++17 P0156R0 Variadic lock_guard VS 2015 C++14 N3302 constexpr For <complex> VS 2015 C++14 N3469 constexpr For <chrono> VS 2015 C++14 N3470 constexpr For <array> VS 2015 C++14 N3471 constexpr For <initializer_list>, <tuple>, <utility> VS 2015 C++14 N3545 integral_constant::operator()() VS 2015 C++14 N3642 UDLs For <chrono>, <string> (1729ms, “meow”s, etc.) VS 2015 C++14 N3644 Null Forward Iterators VS 2015 C++14 N3654 quoted() VS 2015 C++14 N3657 Heterogeneous Associative Lookup VS 2015 C++14 N3658 integer_sequence VS 2015 C++14 N3659 shared_mutex (Timed) VS 2015 C++14 N3668 exchange() VS 2015 C++14 N3669 Fixing constexpr Member Functions Without const VS 2015 C++14 N3670 get<T>() VS 2015 C++14 N3671 Dual-Range equal(), is_permutation(), mismatch() VS 2015 C++14 N3778 Sized Deallocation VS 2015 C++14 N3779 UDLs For <complex> (3.14i, etc.) VS 2015 C++14 N3789 constexpr For <functional> VS 2015 C++14 N3887 tuple_element_t VS 2015 C++14 N3891 Renaming shared_mutex (Timed) To shared_timed_mutex VS 2015 C++17 N3911 void_t VS 2015 C++17 N4089 Safe Conversions In unique_ptr<T[]> VS 2015 C++17 N4169 invoke() 2015 opt-in C++17 N4190 Removing auto_ptr, random_shuffle(), And Old <functional> Stuff VS 2015 C++17 N4258 noexcept Cleanups VS 2015 C++17 N4259 uncaught_exceptions() VS 2015 C++17 N4277 Trivially Copyable reference_wrapper VS 2015 C++17 N4279 insert_or_assign()/try_emplace() For map/unordered_map VS 2015 C++17 N4280 size(), empty(), data() VS 2015 C++17 N4366 Precisely Constraining unique_ptr Assignment VS 2015 C++17 N4389 bool_constant VS 2013 C++14 N3346 Minimal Container Element Requirements VS 2013 C++14 N3421 Transparent Operator Functors (less<>, etc.) VS 2013 C++14 N3655 Alias Templates For <type_traits> (decay_t, etc.) VS 2013 C++14 N3656 make_unique() VS 2013 C++17 N4510 Supporting Incomplete Types In vector/list/forward_list N/A C++14 N3924 Discouraging rand() N/A C++17 N4284 Contiguous Iterators N/A C++17 P0175R1 Synopses For The C Library N/A C++17 P0180R2 Reserving Namespaces For Future Standardization N/A C++17 P0346R1 A <random> Nomenclature Tweak N/A C++17 P0371R1 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 Issue 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