Share via


在 VS “15” Preview 5中关于C++14/17 Features 和STL的修复

[原文发表地址] 在 VS “15” Preview 5中关于C++14/17 Features 和STL的修复

[原文发表时间] 2016/10/11

Visual Studio15的预览版现在可以使用了。(正如我们在之前的变更日志中所解释的那样,VS“15”是一个新的IDE版本号,而不代表年。它是在VS2015(它的IDE版本号是14)之后的下一个版本。在VS中发布的年,IDE和C++编译器都有不同的版本号。)

预览5中增加了C++14中扩展的constexpr, 并且无条件地全面支持range-for(C++17中的这个变更在C++14中已经被确定要修复),也支持C++17中的static_assert, shared_ptr::weak_type, <optional>和<variant>。 我们也像往常一样 修复了很多编译器和类库的缺陷,而且解决了多于10个类库的问题。

另外,VS“15”后续版本会发布对C++17中的<any>, <string_view>, apply()和make_from_tuple()的支持。它也将包含对std::vector的正确性和性能的彻底修复。当前我们仍然为了VS“15”RC的发布而工作。现在,你可以尝试访问daily toolset builds,如果发现了任何缺陷,请报告在预览5或者daily toolset builds中。

编译器功能

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] 我们故意忽略了在C++11中已经被弃用的C++03中的动态异常规范,并且我们没有实现它的计划,希望它以后可以从C++标准中移除。

[B] 编译器对SFINAE表达式的支持仍然在持续改进中(我们已经从VS2015的Update 2版本开始对STL有了足够的改进),但还是不完整的。最近,我们将发布一篇博客来详细地介绍这部分功能。

[C] 关于C99 预处理的规则, 目前编译器仍然是部分支持。可变的宏定义已经被支持了,但是在运行中仍然还有很多的缺陷,在标记为Yes之前我们会对它进行彻底的修复。

[D] 这个功能被标记为不适用。虽然编译器是允许的,但是很多时候是不需要支持扩展的整数类型的,比如在GCC和Clang中,所以我们选择不支持它。

[E] 这个功能同样被标记为不适用。虽然编译器是允许的,但是不需要实现这种优化。

[P4] 在VS“15”的预览版4中实现。

[P4] 在VS“15”的预览版5中实现。

[*] 这些功能通过编译选项/std:c++latest被保留。

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

这张表有些复杂,我们用它来跟踪我们的工作,所以它必须有足够详细的信息告诉我们该干什么。

“…”表示在the Library Fundamentals V1 文档的位置已经被分解为一些独立的模块。

“missing”表示还没有实现,但我们正在努力实现! 尽管从一月份我们已经开始全面投入这部分功能, 但是由于需要改进的模块与日俱增,所以仍有部分模块需要实现。“patch”表明这个模块将会被加入, 而且关于这个模块的文档说明也需要同步更新。我们会一起实现它们,所以它们并不是真的可以为我们做一些额外的工作。(每一个patch都被分组在受到影响的功能的下面)

“doomed”表示Ordered By Default功能被发现破坏了ABI的兼容性(在其它编译器中),所以任何供应商都不会去实现它,将会在C++17中移除。

“N/A”表示没有实现这些功能——它们在标准中有更改,但并没有为了它们的实现做任何工作,列出它们是为了让表格更加完整。

“VS 2013”表明这个模块是在很久远的编译器中被长期支持的功能。

“VS 2015”指这是在VS2015 RTM中被支持的功能。

“Update 2”和“Update 3”指VS 2015。

“Preview 4” 和“Preview 5” 指VS “15” 。

“RC”表示这些功能被提交进了VS”15”中, 但是没能及时的进入预览5中。它们在接下来的版本中被发布。

请注意,虽然我们实现了Filesystem TS(由于历史原因,我们会在<experimental/filesystem>和<filesystem>两个地方提供大家使用),我们必须在完整它的命名空间和在标准文档中标记该部分为“已经实现”之前彻底修复它。

STL在VS“15”预览5中的修复

修复了silent bad codegen对自定义分配器请求propagate_on_container_copy_assignment和propagate_on_container_move_assignment的处理。

添加了<cstdalign>。

提高了weak_ptr::lock()的性能。

修复了std::promise移动赋值操作,它之前会导致代码死锁 (VSO#243880/Connect#2972781)。

修复了编译器隐式转换atomic<T *>到T *的错误(VSO#257598)。

pointer_traits<Ptr>现在可以正确的检测Ptr::rebind<U>。

修复了move_iterator中减法操作中丢失的const限定符。

atomic<T>现在允许做operator&()重载操作(VSO#198738)。

改进了编译诊断器不正确的bind()调用(VSO#246001, reddit)。

简化了unique_ptr::operator->() (VSO#239517/Connect#2918170)。

更改了容器适配器,使它可以隐式的定义copy/move构造(VSO#234651)。

为了提高编译器的性能,STL头文件尽量避免包含一些不必要的内联编译 (VSO#221287, 这是Clang和Chromium的开发人员的需求),这本身就有大量的代码修改。如果你的代码中假定 <vector>或者其他的STL头文件已经被嵌入到intrin.h>中,因此这些大量的头文件将会提供一些编译器内联函数的声明。 遗憾的是这种假设已经被否决了。现在如果想要包含一个仅仅还有内联函数的头文件时, 我们需要让sub-header 和atomic 生效。 如果你遇到了编译错误, 这种修复比较简单: 直接包含<intrin.h> 就可以了。

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

即使我们已经省略了146个N/A的问题,这张表仍然很大。Library组的人员还工作在修复大量关于标准的缺陷上。

“New”代表这个问题还没有真正的被解决在C++17中,我们觉得这些问题必须在影响其他功能前被处理掉,希望将来我们实现的解决方案会被大家接受。

“RTM”表示这个问题被修复在官方发布的VS”15”中,但是并没有被及时的发布在候选版本中。

“WCFB02”代表这些问题以后会被修复在不兼容二进制的STL中(不是VS”15”中的STL)。

“filesystem”代表对于会影响<filesystem>的问题,我们会考虑合适的时候彻底的修复这些功能。

“Parallel”代表这些问题影响并行算法功能,我们还没有实现它们。

请注意:我们实现了C++14 STL的所有功能(VS2015 Update 2中的result_of SFINAE是最后一个功能)和C++14 Library的所有问题,不包括LWG 2140(由于二进制兼容问题没有被修复在VS”15”中),在VS”15”RC中还对std::vector有彻底的修复。对于这些,我们最近会发表更详细的介绍。

这里有两个问题是值得注意的。LWG 2350 和LWG 2369在预览5中被实现,意思是在min/max/minmax(initializer_list)和min_element/max_element/minmax_element中启用了C++ 14 constexpr。然而,我们的codegen编译器(C1XX and Clang),可以编译通过这些代码,但是还不支持智能感知编译器(EDG)。我们正在修复它。

Billy Robert O’Neal III – @MalwareMinigunbion@microsoft.com

Casey Carter – @CoderCaseycacarter@microsoft.com

Stephan T. Lavavej – @StephanTLavavejstl@microsoft.com