Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
[原文发表地址] 在 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