在 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中。
编译器功能
[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 |
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 |
这张表有些复杂,我们用它来跟踪我们的工作,所以它必须有足够详细的信息告诉我们该干什么。
“…”表示在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 |
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 – @MalwareMinigun – bion@microsoft.com
Casey Carter – @CoderCasey – cacarter@microsoft.com
Stephan T. Lavavej – @StephanTLavavej – stl@microsoft.com