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

N3462

SFINAE-Friendly result_of

缺失

C++17

N4387

Improving pair And tuple

缺失

C++17

N4508

shared_mutex (Untimed)

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

"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])。

核心语言

C++11核心语言特性

VS 2013

VS 2015

备注

Rvalue references

部分

 

ref-qualifiers

 

Non-static data member initializers

部分

 

Variadic templates

 

Initializer lists

部分

 

static_assert

 

auto

 

Trailing return types

 

Lambdas

 

decltype

 

Right angle brackets

 

Default template args for function templates

 

Expression SFINAE

[1]

Alias templates

 

Extern templates

 

nullptr

 

Strongly typed enums

 

Forward declared enums

 

Attributes

[RTM]

constexpr

[RTM]

Alignment

部分

 

Delegating constructors

 

Inheriting constructors

 

Explicit conversion operators

 

char16_t and char32_t

 

Unicode string literals

 

Raw string literals

 

Universal character names in literals

 

User-defined literals

 

Standard-layout and trivial types

 

Defaulted and deleted functions

部分

 

Extended friend declarations

 

Extended sizeof

 

Inline namespaces

 

Unrestricted unions

 

Local and unnamed types as template args

 

Range-based for-loop

 

override and final

 

Minimal GC support

 

noexcept

 

C++11 Core 核心语言特性: 并行性

VS 2013

VS 2015

备注

Reworded sequence points

 

Atomics

 

Strong compare and exchange

 

Bidirectional fences

 

Memory model

 

Data-dependency ordering

 

Data-dependency ordering: attributes

[RTM]

exception_ptr

 

quick_exit and at_quick_exit

 

Atomics in signal handlers

 

Thread-local storage

部分

 

Magic statics

 

C++11 核心语言特性: C99

VS 2013

VS 2015

备注

__func__

部分

 

C99 preprocessor

部分

部分

[2]

long long

 

Extended integer types

N/A

N/A

[3]

C++14 核心语言特性

VS 2013

VS 2015

备注

Tweaked wording for contextual conversions

 

Binary literals

 

auto and decltype(auto) return types

 

init-captures

 

Generic lambdas

 

Variable templates

 

Extended constexpr

 

NSDMIs for aggregates

 

Avoiding/fusing allocations

N/A

N/A

[4]

[[deprecated]] attributes

[RTM]

Sized deallocation

 

Digit separators

 

C++1z (C++17?) 核心语言特性

VS 2013

VS 2015

备注

New rules for auto with braced-init-lists

 

Terse static_assert

 

typename in template template-parameters

 

Removing trigraphs

 

Nested namespace definitions

 

Fixing qualification conversions

 

Attributes for namespaces and enumerators

[RTM]

u8 character literals

[RTM]

Allowing more non-type template args

 

Fold expressions

 

[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++类库团队

stl@microsoft.com