2015RTM版本中的C++11/14/17 特性
[原文发表地址] C++11/14/17 Features In VS 2015 RTM
[原文发表时间] 2015/06/19 11:47AM
尽管我们现在还在完成VS2015 RTM版本的工作,但是, 我们已明确完成了新增加的特性,因此可以发布最终特性表格了。让我们从标准模板类库(STL) 开始,自4月份2015RC特性发布后,我们又在标准模板类库中实现了一系列特性。下文中所提到的C++17标准,均指标准文档N4527。
标准库
这张C++14/17类库特性表格包含了一些新行列。这些特性是由C++委员会在5月份投票加入到C++17标准文档。
状态 |
标准 |
文档 |
标题 |
缺失 |
C++14 |
SFINAE-Friendly result_of |
|
缺失 |
C++17 |
Improving pair And tuple |
|
缺失 |
C++17 |
shared_mutex (Untimed) |
|
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 |
"2015 opt-in"指的是由宏保护。 默认情况下,我们提供auto_ptr等模板类。如果你在项目中定义了_HAS_AUTO_PTR_ETC为0(应该通过命令行或者项目文件来定义,而不是通过#define), 那么我们将不会提供auto_ptr等模板类。在下一个重大版本中,我打算设计为opt-out,在下一重大版本后,我打算完全取消auto_ptr等模板类。也许现在将是你整合代码的好机会。
"N/A" 指的是这些提议修改了标准文档的措辞,但是实际上并没有影响到实施者或者用户。出于完整性考虑,我把它们列为不支持。
这是我们状态的详细概述:
我们的C99标准类库已基本实现,除了tgmath.h 文件(其与C++并不相关)以及和编译指示宏CX_LIMITED_RANGE/FP_CONTRACT 。
此外, 我们的C++11 标准类库也已全部实现。
此外, 我们的C++14标准库已基本实现,除了标准文档N3462中的Expression SFINAE 和LWG 2132中的std::function, 外加11+个类库问题。
此外,C++17-so-far标准类库实现工作已完成,除了标准文档N4387中pair/tuple的改进部分和标准文档N4508中的shared_mutex部分,外加10 个类库问题。
任何遗留的例外情况都是Bug。(顺便说一句,在2013和2015之间,粗略算来,我们共修复了160个STL的bug。一年前,我列出了第一批修复清单。我会很快写出剩余的修复清单。)例如,我们已实现了C++17-so-far STL标准文档中的所有情况下的constexpr特性, 除了少数例外情况。我们通过DevDiv#1184873/Connect#1414341 和DevDiv#1188232来追踪这些例外情况。
· (C99) offsetof
· (C++11) numeric_limits<float/double/long double>::quiet_NaN()/signaling_NaN()
· (C++11) mutex的默认构造函数
· (C++14) error_category的的默认构造函数
· (C++14) min()/max()/minmax() 中的initializer_list
· (C++17) min_element()/max_element()/minmax_element()
我们一直专注于实现标准的一致性,这一优先级要高于实现委员会制定的各种技术规范。(我们认为技术规范很重要,但是标准更重要。)尽管如此,我们仍实现了一系列技术规范,如:"V3" TS (N4100)系统文件和清空统一容器(N4529 [container.erasure])。
核心语言
VS 2013 |
VS 2015 |
备注 |
|
部分 |
是 |
||
否 |
是 |
||
部分 |
是 |
||
是 |
是 |
||
部分 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
否 |
否 |
[1] |
|
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
否 |
是 |
[RTM] |
|
否 |
是 |
[RTM] |
|
部分 |
是 |
||
是 |
是 |
||
否 |
是 |
||
是 |
是 |
||
否 |
是 |
||
否 |
是 |
||
是 |
是 |
||
否 |
是 |
||
否 |
是 |
||
是 |
是 |
||
部分 |
是 |
||
是 |
是 |
||
否 |
是 |
||
否 |
是 |
||
否 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
否 |
是 |
||
C++11 Core 核心语言特性: 并行性 |
VS 2013 |
VS 2015 |
备注 |
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
是 |
是 |
||
否 |
是 |
[RTM] |
|
是 |
是 |
||
否 |
是 |
||
是 |
是 |
||
部分 |
是 |
||
否 |
是 |
||
C++11 核心语言特性: C99 |
VS 2013 |
VS 2015 |
备注 |
部分 |
是 |
||
部分 |
部分 |
[2] |
|
是 |
是 |
||
N/A |
N/A |
[3] |
|
C++14 核心语言特性 |
VS 2013 |
VS 2015 |
备注 |
是 |
是 |
||
否 |
是 |
||
否 |
是 |
||
否 |
是 |
||
否 |
是 |
||
否 |
否 |
||
否 |
否 |
||
否 |
否 |
||
N/A |
N/A |
[4] |
|
否 |
是 |
[RTM] |
|
否 |
是 |
||
否 |
是 |
||
C++1z (C++17?) 核心语言特性 |
VS 2013 |
VS 2015 |
备注 |
否 |
是 |
||
否 |
否 |
||
否 |
是 |
||
是 |
是 |
||
否 |
否 |
||
否 |
否 |
||
否 |
是 |
[RTM] |
|
否 |
是 |
[RTM] |
|
否 |
否 |
||
否 |
否 |
[RTM] 这些特性在RC版本和RTM版本之间实现。
[1] 我们计划在2015 RTM 版本之后,立即在编译器上实现SFINAE 表达式, 同时我们还计划在2015 Update版本中集成该特性, 以支持产品使用。 (但并没有必要是2015 Update 1。这可能需要更长的时间。)
[2] 对C99 预处理器的支持并未改变。 它被标为部分支持是因为尽管编译器支持可变宏, 但是我们的预处理器在很多方面的表现与C99/C++11并不一致。
[3] "扩展整数类型" 被列为不可用是因为(C++)标准允许,但是并不要求支持长度大于于long long的类型。为了与之前保持一致,我们暂时不支持这种类型。不论是 GCC还是Clang都没有实现此类型。
[4] "Avoiding/fusing allocations" 被列为不可用是因为标准允许,但并不要求此项优化。为了与之前保持一致,我们选择不实现它(至少现在不实现)。
有关C++11常量表达式的注意点:这一特性非常庞大,错综复杂,并贯穿于整个核心语言。该特性通过现代化编译器代码库实现,并在第一时间发布。这包含Bug和limitations,其中一些你可能也注意到了,很多的bug将会在update版本中修复。(例如,目前,编译器无法在非标量静态常量表达式数据成员中发出初始化器,包含字符数组。这种情况我们以作为错误的警告C4579进行通知。)然而, 我选择将C++11常量表达式列为完成,是因为STL 可以成功调用常量表达式,并且经常使用。(STL中少数缺失常量表达式的情况仅限于类库的问题,其缺少强大的编译器钩子和C++14扩展常量表达式循环)
最后,我们非常感谢每一个在VS2015开发周期中报告Bug的人,这些Bug不只是常量表达式方面的, 而是整个产品的。如果你遇到任何Bug,请通过Microsoft Connect 或者发送微笑/皱眉来提交。
Stephan T. Lavavej
高级开发工程师 - Visual C++类库团队