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

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

 

Expression SFINAE

Partial

[B]

C99 preprocessor

Partial

[C]

Extended integer types

N/A

[D]

C++14 Core Language Features

VS “15”

Notes

Avoiding/fusing allocations

N/A

[E]

Tweaked wording for contextual conversions

Yes

 

Binary literals

Yes

 

auto and decltype(auto) return types

Yes

 

init-captures

Yes

 

Generic lambdas

Yes

 

Variable templates

Yes

 

Extended constexpr

Yes

[P5]

NSDMIs for aggregates

Yes

[P4]

[[deprecated]] attribute

Yes

 

Sized deallocation

Yes

 

Digit separators

Yes

 

C++17 Core Language Features

VS “15”

Notes

New rules for auto with braced-init-lists

Yes

 

Terse static_assert

Yes

[P5] [*]

typename in template template-parameters

Yes

 

Removing trigraphs

Yes

 

Nested namespace definitions

Yes

[*]

Fixing qualification conversions

No

 

Attributes for namespaces and enumerators

Yes

 

u8 character literals

Yes

 

Allowing more non-type template args

No

 

Fold expressions

No

 

Removing some empty unary folds

No

 

Removing the register keyword

No

 

Removing operator++ for bool

No

 

Adding noexcept to the type system

No

 

Extended aggregate initialization

No

 

Capturing *this by value

No

 

__has_include

No

 

Rewording inheriting constructors

No

 

Direct-list-init of fixed enums from integers

No

 

constexpr lambdas

No

 

Generalized range-based for-loops

Yes

[P5]

[[fallthrough]] attribute

Yes

[P4] [*]

[[nodiscard]] attribute

No

 

[[maybe_unused]] attribute

No

 

Hexfloat literals

No

 

Using attribute namespaces without repetition

No

 

Over-aligned dynamic memory allocation

No

 

Template argument deduction for class templates

No

 

Declaring non-type template parameters with auto

No

 

Guaranteed copy elision

No

 

Replacement of class objects containing reference members

No

 

Refining expression evaluation order

No

 

Structured bindings

No

 

Ignoring unrecognized attributes

No

 

constexpr if-statements

No

 

Selection statements with initializers

No

 

Inline variables

No

 

Explicit default constructors and copy-list-initialization

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

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 – @MalwareMinigunbion@microsoft.com

Casey Carter – @CoderCaseycacarter@microsoft.com

Stephan T. Lavavej – @StephanTLavavejstl@microsoft.com