vs 2017 15.3 预览版c++17 特性

[原文发表地址] vs 2017 15.3 预览版c++17 特性

[原文发表时间] 2017/5/10

vs 2017 15.3 预览版 现在已经上线, 它涵盖了更新之后的C++ toolset (例如, 编译器,连接器以及库), 和之前vs 2015 的更新一样, 我们基本以类似的发布频率在VS 2017 的改动中添加了C++17 特性。 然而和vs2015的改动(包含了IDE和toolset 的改变)不同的是, vs2017 IDE 的更新更加频繁(我们称之为“小步快跑”)。这也是为什么这是第一次toolset 的更新 (称之为“ 基础更新“)。

下表所示是关于编译器模块。虽然你可以下载vs 2017 15.3 预览版1, 但是我们最新提交的一些新增模块只能在预览版2中生效了, 当然这个预览版2也将很快被发布。为了明确指出这些模块的集合,因此在预览版2(当下还没有发布) 中生效的这些模块将被标注为[P2]。

++03/11 Core Language Features Status Paper Notes
[Everything else] VS 2015 [A]
Two-phase name lookup Partial [twoPhase]
Expression SFINAE Partial N2634 [B]
C99 preprocessor Partial N1653 [C]
Extended integer types N/A N1988 [D]
C++14 Core Language Features Status Paper Notes
Avoiding/fusing allocations N/A N3664 [E]
Tweaked wording for contextual conversions VS 2013 N3323
Binary literals VS 2015 N3472
auto and decltype(auto) return types VS 2015 N3638
init-captures VS 2015 N3648
Generic lambdas VS 2015 N3649
Variable templates VS 2015.2 N3651
Extended constexpr VS 2017 N3652
NSDMIs for aggregates VS 2017 N3653
[[deprecated]] attribute VS 2015 N3760
Sized deallocation VS 2015 N3778
Digit separators VS 2015 N3781
C++17 Core Language Features Status Paper Notes
New rules for auto with braced-init-lists VS 2015 N3922 [14]
Terse static_assert VS 2017 N3928
typename in template template-parameters VS 2015 N4051 [14]
Removing trigraphs VS 2010 N4086 [14]
Nested namespace definitions VS 2015.3 N4230
Fixing qualification conversions No N4261
Attributes for namespaces and enumerators VS 2015 N4266 [14]
u8 character literals VS 2015 N4267 [14]
Allowing more non-type template args No N4268
Fold expressions No N4295
Removing some empty unary folds No P0036R0
Removing the register keyword VS 2017.3 P0001R1
Removing operator++ for bool VS 2017.3 P0002R1
Adding noexcept to the type system No P0012R1
Extended aggregate initialization No P0017R1
Capturing *this by value VS 2017.3 P0018R3
__has_include VS 2017.3 [P2] P0061R1 [14]
Rewording inheriting constructors No P0136R1
Direct-list-init of fixed enums from integers VS 2017.3 P0138R2
constexpr lambdas VS 2017.3 P0170R1
Generalized range-based for-loops VS 2017 P0184R0 [14]
[[fallthrough]] attribute VS 2017 P0188R1
[[nodiscard]] attribute VS 2017.3 P0189R1
[[maybe_unused]] attribute VS 2017.3 P0212R1
Hexfloat literals No P0245R1
Using attribute namespaces without repetition VS 2017.3 P0028R4
Over-aligned dynamic memory allocation No P0035R4
Template argument deduction for class templates No P0091R3
Declaring non-type template parameters with auto No P0127R2
Guaranteed copy elision VS 2017.3 P0135R1
Refining expression evaluation order No P0145R3
Structured bindings VS 2017.3 P0217R3
Ignoring unrecognized attributes No P0283R2
constexpr if-statements VS 2017.3 [P2] P0292R2 [F]
Selection statements with initializers VS 2017.3 [P2] P0305R1
Inline variables No P0386R2
Matching template template-parameters to compatible arguments No P0522R0
Removing dynamic-exception-specifications No P0003R5
Pack expansions in using-declarations No P0195R2

[A]除了动态异常说明之外, C++11 中被淘汰的那些模块大部分已经在C++17 中被移除。 注意到 c++17 18.4 [except.spec]/提到:” 非异常说明符throw() 已经被被淘汰(D,3) ”,也就说说非异常说明符noexcept(true)。” 但是vs2017 15.3 预览版目前考虑将throw() 替换为__declspec(nothrow)。

[twoPhase] 尽管vs2017 15.3 版本不支持two-Phase 字段查找, 但是编译器团队仍然在基于后台正在完成一些主要的功能。 对预览版2 而言, /permissive- 这个编译选项将会激活部分支持two-phase 字段的查找(这里部分粗略计算有60%)。 我们也会在后期发布一个详细的博客来阐述具体的细节。

[B] 尽管SFINAE 表达式是部分支持, 它基本已经覆盖完全了。在vs 2015.2 中,对于STL 后台而言是充分支持的, 而且SFINAE 表达式对于像boost之类的第三方库已经进行了进一步的缺陷修复。 目前存在的最大缺陷是: 当实现void_t/decltype SFINAE 表达式时, 需要使用特定的标签类型。

[C] 就可变参数宏的的工作范畴而言,C99 预处理目前仍是部分支持。 我们正在计划在标注为完成之前,检修预处理器。

[D] 允许拓展整型类型但是不要求这样做。对于Clang 和Gcc 编译器而言,我们将不会实现这项功能。

[E] allocations 的使用并没有进行严格的界限,当下,我们仍然选择暂不实现。

[F]支持 /std:C++14 警告C4984: ‘if constexpr’ is a C++17 language extension。这将会允许STL在函数实现内部 (将来)去使用 “if constexpr”。

[14] 这些特性已经是可用的,当然也支持 /std:C++14。

[P2] 这些特性已经被提交, 在vs2017.3预览版2 中将会可用。

下面是STL 模块的更新列表:

Status Std Paper Title Notes
missing C++17 P0604R0 Changing is_callable/result_of To is_invocable/invoke_result (Options A and B)
missing C++17 P0005R4 not_fn()
patch C++17 P0358R1 Fixes For not_fn()
missing C++17 P0618R0 Deprecating <codecvt>
missing C++17 P0521R0 Deprecating shared_ptr::unique()
missing C++17 P0174R2 Deprecating Vestigial Library Parts
missing C++17 P0003R5 Removing Dynamic Exception Specifications
missing C++17 P0302R1 Removing Allocator Support In std::function
missing C++17 P0433R2 Deduction Guides For The STL
missing C++17 P0607R0 Inline Variables For The STL (Options A and B2)
missing C++17 P0258R2 has_unique_object_representations
missing C++17 P0426R1 constexpr For char_traits
missing C++17 P0063R3 C11 Standard Library
missing C++17 P0033R1 Rewording enable_shared_from_this
missing C++17 P0414R2 shared_ptr<T[]>, shared_ptr<T[N]>
patch C++17 P0497R0 Fixing shared_ptr For Arrays
missing C++17 P0083R3 Splicing Maps And Sets
patch C++17 P0508R0 Clarifying insert_return_type
missing C++17 P0067R5 Elementary String Conversions
C++17 P0220R1 Library Fundamentals V1
missing C++17 <memory_resource>
patch C++17 P0337R0 Deleting polymorphic_allocator Assignment
missing C++17 P0030R1 hypot(x, y, z)
missing C++17 P0226R1 Mathematical Special Functions
missing C++17 P0024R2 Parallel Algorithms [G]
patch C++17 P0336R1 Renaming Parallel Execution Policies
patch C++17 P0394R4 Parallel Algorithms Should terminate() For Exceptions
patch C++17 P0452R1 Unifying <numeric> Parallel Algorithms
missing C++17 P0218R1 <filesystem>
patch C++17 P0219R1 Relative Paths For Filesystem
patch C++17 P0317R1 Directory Entry Caching For Filesystem
patch C++17 P0392R0 Supporting string_view In Filesystem Paths
patch C++17 P0430R2 Supporting Non-POSIX Filesystems
patch C++17 P0492R2 Resolving NB Comments For Filesystem
VS 2017.3 [P2] C++17 P0031R0 constexpr For <array> (Again) And <iterator>
VS 2017.3 [P2] C++17 P0084R2 Emplace Return Type
VS 2017.3 [P2] C++17 P0295R0 gcd(), lcm()
VS 2017.3 [P2] C++17 P0298R3 std::byte [H]
VS 2017.3 [P2] C++17 P0435R1 Overhauling common_type [14]
VS 2017.3 [P2] C++17 P0505R0 constexpr For <chrono> (Again)
VS 2017.3 [P2] C++17 P0548R1 Tweaking common_type And duration [14]
VS 2017.3 C++17 Boyer-Moore search()
VS 2017.3 C++17 P0040R3 Extending Memory Management Tools
VS 2017.3 C++17 P0152R1 atomic::is_always_lock_free
VS 2017.3 C++17 P0154R1 hardware_destructive_interference_size, etc.
VS 2017.3 C++17 P0156R2 Renaming Variadic lock_guard To scoped_lock
VS 2017.3 C++17 P0253R1 Fixing Searcher Return Types
VS 2017.3 C++17 P0403R1 UDLs For <string_view> (“meow”sv, etc.)
VS 2017.3 C++17 P0418R2 atomic compare_exchange memory_order Requirements [14]
VS 2017.3 C++17 P0513R0 Poisoning hash [14]
VS 2017.3 C++17 P0516R0 Marking shared_future Copying As noexcept [14]
VS 2017.3 C++17 P0517R0 Constructing future_error From future_errc [14]
VS 2017.3 C++17 P0558R1 Resolving atomic<T> Named Base Class Inconsistencies [I] [14]
VS 2017.3 C++17 P0599R1 noexcept hash [14]
VS 2017 C++17 <algorithm> sample()
VS 2017 C++17 <any>
VS 2017 C++17 <optional>
VS 2017 C++17 <string_view>
VS 2017 C++17 <tuple> apply()
VS 2017 C++17 P0032R3 Homogeneous Interface For variant/any/optional
VS 2017 C++17 P0077R2 is_callable, is_nothrow_callable
VS 2017 C++17 P0088R3 <variant>
VS 2017 C++17 P0163R0 shared_ptr::weak_type
VS 2017 C++17 P0209R2 make_from_tuple()
VS 2017 C++17 P0254R2 Integrating string_view And std::string
VS 2017 C++17 P0307R2 Making Optional Greater Equal Again
VS 2017 C++17 P0393R3 Making Variant Greater Equal
VS 2017 C++17 P0504R0 Revisiting in_place_t/in_place_type_t<T>/in_place_index_t<I>
VS 2017 C++17 P0510R0 Rejecting variants Of Nothing, Arrays, References, And Incomplete Types
VS 2015.3 C++17 P0025R1 clamp()
VS 2015.3 C++17 P0185R1 is_swappable, is_nothrow_swappable
VS 2015.3 C++17 P0272R1 Non-const basic_string::data()
VS 2015.2 C++17 N4387 Improving pair And tuple [14]
VS 2015.2 C++17 N4508 shared_mutex (Untimed) [14]
VS 2015.2 C++17 P0004R1 Removing Deprecated Iostreams Aliases [J]
VS 2015.2 C++17 P0006R0 Variable Templates For Type Traits (is_same_v, etc.) [14]
VS 2015.2 C++17 P0007R1 as_const() [14]
VS 2015.2 C++17 P0013R1 Logical Operator Type Traits (conjunction, etc.) [14]
VS 2015.2 C++17 P0074R0 owner_less<> [14]
VS 2015.2 C++17 P0092R1 <chrono> floor(), ceil(), round(), abs() [14]
VS 2015.2 C++17 P0156R0 Variadic lock_guard [14]
VS 2015 C++17 N3911 void_t [14]
VS 2015 C++17 N4089 Safe Conversions In unique_ptr<T[]> [14]
VS 2015 C++17 N4169 invoke() [14]
VS 2015 C++17 N4190 Removing auto_ptr, random_shuffle(), And Old <functional> Stuff [K]
VS 2015 C++17 N4258 noexcept Cleanups [14]
VS 2015 C++17 N4259 uncaught_exceptions() [14]
VS 2015 C++17 N4277 Trivially Copyable reference_wrapper [14]
VS 2015 C++17 N4279 insert_or_assign()/try_emplace() For map/unordered_map [14]
VS 2015 C++17 N4280 size(), empty(), data() [14]
VS 2015 C++17 N4366 Precisely Constraining unique_ptr Assignment [14]
VS 2015 C++17 N4389 bool_constant [14]
VS 2013 C++17 N4510 Supporting Incomplete Types In vector/list/forward_list [14]
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
N/A C++17 P0467R2 Requiring Forward Iterators In Parallel Algorithms
N/A C++17 P0502R0 Parallel Algorithms Should terminate() For Exceptions, Usually
N/A C++17 P0503R0 Correcting Library Usage Of “literal type”
N/A C++17 P0509R1 Updating “Restrictions on exception handling”
N/A C++17 P0518R1 Copying Trivially Copy Constructible Elements In Parallel Algorithms
N/A C++17 P0523R1 Relaxing Complexity Requirements Of Parallel Algorithms (General)
N/A C++17 P0574R1 Relaxing Complexity Requirements Of Parallel Algorithms (Specific)
N/A C++17 P0623R0 Final C++17 Parallel Algorithms Fixes

“missing” 和“patch”已经分组管理,这一份将不需加以说明。库V1版本的 基本问题已经被分割为独立的模块,标注为“…” 。 最后, “N/A“意味着不再进行句法规范化的修改, 对用户而言也不会衍生出新的模块。 例如,当我们实现了部分算法的时候, 我们将会遵循当下的规范。 为了进一步跟踪,P0394R4 (并行算法应该以抛出异常终止)对用户而言是非常重要的, 而且也是实施者需要去了解的。 然而P0502R0(并行算法应该以抛出异常终止,经常 )却不是这样的。(允许非标准的执行策略产生不同的行为)。

[G] for_each_n() 系列将会在预览版2中生效。

[H]/std:c++17 和/std:c++latest 支持std::byte, 它可以通过定义_HAS_STD_BYTE 为0 来关闭

[I] 除了atomic_meow() 和atomic_meow_explicit()的命名问题之外, 这个问题可以通过替换命名或者提供显式模板参数来修正。我们已经实现了P0558R1 中用户普遍使用的部分(解决了atomic<T> j基类明名不一致问题)

[J] /std:c++17 和/std”c++latest 移除了旧的输入输出流成员函数, 它们也可以通过定义_HAS_OLD_IOSTREAMS_MEMBERS 为1 来恢复。

[K] /std:c++17 和 /std:c++latest 移除了auto_ptr, random_shuffle() 以及一些旧的<functional>成员。 它们也可以通过定义_HAS_AUTO_PTR_ETC 为1 来恢复。

我们已经完成了29个LWG 问题的修复,并且做了一些后台场景的改进,我们这儿提到的将会更接近于vs 2017.3 的最终发布版本。

请尝试vs 2017 15.3 预览版, 当我们知道您的想法。 (请记住:您需要用/std:c++17 或者/std:c++latest 来编译才能激活C++17 的特性, 除过上面表格中标注[14]的之外 – 请记住[P2]只有在预览版2 之后才生效。) 你可以使用IDE 的报告一个问题来提交问题。 关于编译器和库函数的问题, 包含一个完整的测试用例是重要的。