Visual C++ 语言一致性

本主题概述了 Visual Studio 2017 及早期版本中,针对 Visual C++ 的编译器功能和标准库 (STL) 功能的 ISO C ++03、C++11、C++14 以及 C++17 草稿语言标准一致性。 每个编译器和 STL 功能名称都可链接到介绍该功能的 ISO C++ 标准建议文章(如果在发布时可用)。 “支持”列中列出了首次出现在其中并支持该功能的 Visual Studio 版本。

若要深入了解 Visual Studio 2017 中的一致性改进和其他更改,请参阅 Visual Studio 2017 中 C++ 的一致性改进Visual Studio 2017 中 Visual C++ 的新增功能。 若要了解早期版本中的一致性更改,请参阅 Visual C++ 更改历史记录2003 至 2015 各版本中 Visual C++ 的新增功能。 有关来自 C++ 团队的最新信息,请访问 Visual C++ 团队博客

备注

Visual Studio 2015 和 Visual Studio 2017 之间没有二进制的重大更改。

编译器功能

功能区域
C++03/11 核心语言功能 支持
  其他所有内容 VS 2015 1
  两阶段名称查找 No
  N2634 表达式 SFINAE 部分支持 2
  N1653 C99 预处理器 部分支持 3
  N1988 扩展的整型 N/A 4
C++ 14 核心语言功能 支持
  N3664 避免/合成分配 N/A 5
  N3323 上下文转换的已调整 wording VS 2013
  N3472 二进制文本 VS 2015
  N3638 auto 和 decltype(auto) 返回类型 VS 2015
  N3648 init-captures VS 2015
  N3649 泛型 lambda VS 2015
  N3651 变量模板 VS 2015.2
  N3652 扩展的 constexpr VS 2017
  N3653 聚合的 NSDMI VS 2017
  N3760 [[已弃用]] 属性 VS 2015
  N3778 调整大小的释放 VS 2015
  N3781 数字分隔符 VS 2015
C++ 17 核心语言功能 支持
  N3922 针对自动使用大括号内的初始值设定项列表的新建规则 VS 2015
  N3928 简要静态断言 VS 2017 *
  N4051 模板-参数模板的类型名称 VS 2015
  N4086 删除三字符组 VS 2010
  N4230 嵌套的命名空间定义 VS 2015.3 *
  N4261 修复限定转换 No
  N4266 命名空间和枚举器的属性 VS 2015
  N4267 u8 字符文本 VS 2015
  N4268 允许更多非类型模板参数 No
  N4295 折叠表达式 No
  P0036R0 删除某些空的一元折叠 No
  P0001R1 删除 register 关键字 VS 2017.x *
  P0002R1 删除 bool 的 operator++ No
  P0012R1 向类型系统添加 noexcept No
  P0017R1 扩展的聚合初始化 No
  P0018R3 按值捕获 *this VS 2017.x *
  P0061R1 __has_include No
  P0136R1 重新组织继承构造函数 No
  P0138R2 直接列表初始化整数中的固定枚举 VS 2017.x *
  P0170R1 constexpr lambda No
  P0184R0 一般化的基于范围的 for 循环 VS 2017
  P0188R1 [[fallthrough]] 属性 VS 2017 *
  P0189R1 [[nodiscard]] 属性 No
  P0212R1 [[maybe_unused]] 属性 VS 2017.x *
  P0245R1 Hexfloat 文本 No
  P0028R4 不重复使用属性命名空间 No
  P0035R4 过度对齐的动态内存分配 No
  P0091R3 类模板的模板参数推导 No
  P0127R2 使用 auto 声明非类型模板参数 No
  P0135R1 保证副本省略 No
  P0145R3 改进表达式计算顺序 No
  P0217R3 结构化绑定 No
  P0283R2 忽略无法识别的属性 No
  P0292R2 constexpr if 语句 No
  P0305R1 具有初始化表达式的选择语句 No
  P0386R2 内联变量 No
  P0522R0 将template-parameters 模板与兼容参数匹配 No
  P0003R5 删除动态-异常-规范 No
  P0195R2 using 声明中的包扩展 No

标准库功能/STL 功能

功能区域
C++17 标准库功能 支持
  P0433R2 用于 STL 的推导指南 No
  P0607R0 用于 STL 的内联变量(选项 A 和 B2) No
  P0258R2 has_unique_object_representations No
  P0426R1 char_traits 的 constexpr No
  P0604R0 将 is_callable/result_of 更改为 is_invocable/invoke_result(选项 A 和 B) No
  P0156R2 重命名可变参数 lock_guard to scoped_lock No
  P0558R1 解决 atomic 已命名基类不一致的问题 No
  P0298R3 std::byte No
  P0063R3 C11 标准库 No
  P0030R1 hypot(x, y, z) No
  P0435R1 修改 common_type
  P0548R1 调整 common_type 和持续时间
No
  P0513R0 中毒哈希
  P0599R1 noexcept 哈希
No
  P0033R1 重新组织 enable_shared_from_this No
  P0220R1 Library Fundamentals V1 部分支持 6
  P0414R2 shared_ptr<T[]>、shared_ptr<T[N]>
  P0497R0 修复数组的 shared_ptr
No
  P0084R2 Emplace 返回类型 No
  P0083R3 拼接映射和集
  P0508R0 阐明 insert_return_type
No
  P0031R0 <数组> (Again) 和 <迭代器>的 constexpr No
  P0505R0 <chrono> (Again) 的 constexpr No
  P0005R4 not_fn()
  P0358R1 not_fn() 的修补程序
No
  P0295R0 gcd()、lcm() No
  P0154R1 hardware_destructive_interference_size 等 No
  P0067R5 基本字符串转换 No
  N4562 库基础知识:Boyer Moore search()
  P0253R1 修复搜索器返回类型
No
  P0618R0 弃用 <codecvt> No
  P0521R0 弃用 shared_ptr::unique() No
  P0174R2 弃用残留库部分 No
  P0003R5 删除动态异常规范 No
  P0302R1 删除 std::function 中的分配器支持 No
  P0040R3 扩展内存管理工具 No
  N4562 库基础知识:<memory_resource>
  P0337R0 删除 polymorphic_allocator 分配
No
  P0024R2 并行算法
  P0336R1 重命名并行执行策略
  P0394R4 并行算法应该对异常调用 terminate()
  P0452R1 统一 <numeric> 并行算法
No
  P0226R1 特殊数学函数 No
  P0218R1 <filesystem>
  P0219R1 文件系统的相对路径
  P0392R0 文件系统路径中支持 string_view
  P0430R2 支持非 POSIX 文件系统
  P0492R2 解析文件系统的 NB Comments 注释
No 7
  P0152R1 atomic::is_always_lock_free VS 2017.x
  P0403R1 <string_view>(“meow”sv 等)的 UDL VS 2017.x
  P0418R2 原子 compare_exchange memory_order 要求 VS 2017.x
  P0516R0 将 shared_future 复制标记为 noexcept VS 2017.x
  P0517R0 从 future_errc 构造 future_error VS 2017.x
  N4562 库基础知识:<algorithm> sample() VS 2017
  N4562 库基础知识:<any> VS 2017
  N4562 库基础知识:<optional> VS 2017
  N4562 库基础知识:<string_view> VS 2017
  N4562 库基础知识:<tuple> apply() VS 2017
  P0032R3 variant/any/optional 的同类接口 VS 2017
  P0077R2 is_callable、is_nothrow_callable VS 2017
  P0088R3 <variant> VS 2017
  P0163R0 shared_ptr::weak_type VS 2017
  P0209R2 make_from_tuple() VS 2017
  P0254R2 将 string_view 和 std::string 集成 VS 2017
  P0307R2 使 Optional 再次大于等于 VS 2017
  P0393R3 使 Variant 大于等于 VS 2017
  P0504R0 再次访问 in_place_t/in_place_type_t<T>/in_place_index_t<I> VS 2017
  P0510R0 拒绝 Nothing、数组、引用和不完整类型的 variant VS 2017
  P0025R1 clamp() VS 2015.3
  P0185R1 is_swappable、is_nothrow_swappable VS 2015.3
  P0272R1 非常量 basic_string::data() VS 2015.3
  N4387 改进 pair 和 tuple VS 2015.2
  N4508 shared_mutex (Untimed) VS 2015.2
  P0004R1 删除已弃用的 Iostreams 别名 VS 2015.2
  P0006R0 类型特征(is_same_v 等)的变量模板 VS 2015.2
  P0007R1 as_const() VS 2015.2
  P0013R1 逻辑运算符类型特征(conjunction 等) VS 2015.2
  P0074R0 owner_less<> VS 2015.2
  P0092R1 <chrono> floor()、ceil()、round()、abs() VS 2015.2
  P0156R0 可变参数 lock_guard VS 2015.2
  N3911 void_t VS 2015
  N4089 unique_ptr<T[]> 中的安全转换 VS 2015
  N4169 invoke() VS 2015
  N4190 删除 auto_ptr、random_shuffle() 和旧的 <功能> 内容 VS 2015
  N4258 noexcept 清理 VS 2015
  N4259 uncaught_exceptions() VS 2015
  N4277 可完全复制的 reference_wrapper VS 2015
  N4279 map/unordered_map 的 insert_or_assign()/try_emplace() VS 2015
  N4280 size()、empty()、data() VS 2015
  N4366 精确限制 unique_ptr 分配 VS 2015
  N4389 bool_constant VS 2015
  N4510 支持 vector/list/forward_list 中的不完整类型 VS 2013
  N4284 连续迭代器 不可用
  P0175R1 C 库的概要 不可用
  P0180R2 保留命名空间用于将来标准化 不可用
  P0346R1 A <随机> 命名法调整 不可用
  P0371R1 阻止 memory_order_consume 不可用
  P0467R2 需要用于并行算法的前向迭代器 不可用
  P0502R0 通常并行算法应该对异常调用 terminate() 不可用
  P0503R0 更正“文本类型”的库使用情况 不可用
  P0509R1 更新“限制异常处理” 不可用
  P0518R1 在并行算法中轻松复制副本可构造元素 不可用
  P0523R1 放宽并行算法的复杂性要求(常规) 不可用
  P0574R1 放宽并行算法的复杂性要求(特定) 不可用
  P0623R0 最终的 C++17 并行算法修复 不可用
C++14 标准库功能 支持
  N3462 SFINAE 友好的 result_of VS 2015.2
  N3302 <complex> 的 constexpr VS 2015
  N3469 <chrono> 的 constexpr VS 2015
  N3470 <数组> 的 constexpr VS 2015
  N3471 <initializer_list>、<tuple> 和 <utility> 的 constexpr VS 2015
  N3545 integral_constant::operator()() VS 2015
  N3642 <chrono>、<字符串>(1729ms、“meow”s 等)的 UDL VS 2015
  N3644 Null 向前迭代器 VS 2015
  N3654 quoted() VS 2015
  N3657 异类关联查找 VS 2015
  N3658 integer_sequence VS 2015
  N3659 shared_mutex(定时) VS 2015
  N3668 exchange() VS 2015
  N3669 修复不包含常量的 constexpr 成员函数 VS 2015
  N3670 get<T>() VS 2015
  N3671 Dual-Range equal()、is_permutation()、mismatch() VS 2015
  N3778 调整大小的释放 VS 2015
  N3779 <complex>(3.14i 等)的 UDL VS 2015
  N3789 <功能> 的 constexpr VS 2015
  N3887 tuple_element_t VS 2015
  N3891 将 shared_mutex(定时)重命名为 shared_timed_mutex VS 2015
  N3346 容器元素的最低要求 VS 2013
  N3421 透明运算符函子(小于<> 等) VS 2013
  N3655 <type_traits>(decay_t 等)的别名模板 VS 2013
  N3656 make_unique() VS 2013
  N3924 阻止 rand() 不可用

一起列出的一组文章表明某项功能已被选择加入到标准版中,同时也选择加入了一篇或多篇改进和扩展该功能的文章。 这些功能可一起实现。

支持的值

否__表示尚未实现。
__部分支持__意味着尚未在 Visual Studio 2017 中完全实现。 有关详细信息,请参阅注释部分。
__N/A
表示建议文章未介绍功能。 这些文章虽然更改了标准的语言,但没有为实施者创建任何工作。 在此处将其列出是出于完整性的考虑。
VS 2010 表示在 Visual Studio 2010 中支持的功能。
VS 2013 表示在 Visual Studio 2013 中支持的功能。
VS 2015 表示在 Visual Studio 2015 RTM 中支持的功能。
VS 2015.2VS 2015.3 分别表示在 Visual Studio 2015 Update 2 和 Visual Studio 2015 Update 3 中支持的功能。
VS 2017 表示在 Visual Studio 2017 RTM 中支持的功能。
VS 2017.x 表示为 Visual Studio 2017 的将来更新计划的功能。

备注

1 这忽略了 C++03 的动态异常规范,该规范在 C++11 中已被弃用。 没有计划来实现它们,应该会从将来的 C++ 标准版中删除。
2 自 Visual Studio 2015 Update 2 后,编译器对表达式 SFINAE 的支持足以满足标准库,但支持仍不完整。
3 编译器对 C99 预处理器规则的支持在 Visual Studio 2017 中不完整。 Variadic 宏受支持,但预处理器的行为存在很多 Bug。
4 它被标记为“不适用”,因为允许但不要求编译器支持扩展的整数类型。 和 GCC 和 Clang 一样,我们选择不支持它们。
5 同样,它被标记为“不适用”,因为允许但不要求编译器实现此优化。
6 在本表中的其他部分对 Visual Studio 2015 中不完整的功能进行了说明。
7 出于历史原因,文件系统 TS 在 <experimental/filesystem> 和 <filesystem> 中均可实现,但必须先更正其实现才能移动其命名空间。 完成此操作前,此功能标记为尚未实现。
* 这些功能受 /std:c++latest 编译器选项保护。

另请参阅

C++ 语言参考
C++ 标准库
Visual Studio 2017 中 C++ 的符合性改进
Visual Studio 2017 中 Visual C++ 的新增功能
Visual C++ 更改历史记录(2003 - 2015)
Visual C++ 新增功能(2003 - 2015)
Visual C++ 团队博客