Visual Studio 2022 中的 C++ 新变化

Visual Studio 2022 带来了针对 Microsoft C++ 编译器和工具的许多更新和修补程序。 Visual Studio IDE 还在性能和工作效率方面进行了重大改进,而且现在作为 64 位应用程序本机运行。

Visual Studio 版本 17.13 中C++的新增功能

发布日期:2025 年 2 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.13 中面向C++开发人员的新增功能
标准库 (STL) 合并了 C++26 和 C++23 功能、LWG 问题解决方法、性能改进、增强行为和修复的 bug STL 更新日志 17.13
IDE 中的新功能 Visual Studio 2022 版本 17.13 发布说明
C++语言更新 Visual Studio 2022 17.13 中的 MSVC 编译器更新
C++语言一致性改进 Visual Studio 2022 17.13 中的 C++ 一致性改进、行为更改和 bug 修复

简要介绍一些新功能:

  • C++ 语言增强

    • 通过将C++语言标准设置为 /std:c++23preview来试用 C++23 预览功能。 此设置启用最新的 C++23 功能和 bug 修复。 有关详细信息,请参阅 /std (指定语言标准版本)

    • 支持 C++23 的 size_t 字面量后缀,这有助于避免截断或有符号比较不匹配,尤其是在编写循环时。 例如:

      // Infinite loop if v.size > max unsigned int 
      for (auto i = 0u; i < v.size(); ++i)
      { 
        ...
      } 
      
      // Fixed because of uz literal 
      for (auto i = 0uz; i < v.size(); ++i)
      { 
        ...
      } 
      
    • 对 x86 和 x64 上代码生成的向量长度提供支持。 有关详细信息,请参阅 /vlen

    • 支持 Intel 高级矢量扩展 10 版本 1。 有关 /arch:AVX10.1的详细信息,请参阅 /arch (x64)

  • 标准库改进

    • 标准库对协程的支持。 在 P2502R2 的这个示例中,fib 函数是一个协程。 当执行 co_yield 语句时,fib 被挂起,值被返回给调用方。 可以稍后恢复 fib 协程以生成更多值,而不需要任何手动状态处理:

      std::generator<int> fib()
      { 
        auto a = 0, b = 1; 
      
        while (true)
        { 
            co_yield std::exchange(a, std::exchange(b, a + b)); 
        }
      } 
      
      int answer_to_the_universe()
      { 
        auto rng = fib() | std::views::drop(6) | std::views::take(3); 
        return std::ranges::fold_left(std::move(range), 0, std::plus{}); 
      } 
      
  • system_clockhigh_resolution_clockchrono_literals 从常用内部标头移动到 <chrono>。 如果你看到像 system_clock 这样的类型或像 1729ms 这样的用户定义的字面量无法识别的编译器错误,请包括 <chrono>

  • 改进了字符串、basic_string::find_last_of()remove()ranges::removeminmax_element()minmax() 算法系列中 bitset 构造函数的矢量化实现。

  • 添加了向量化实现:

    • find_end()ranges::find_end 用于 1 字节和 2 字节元素。
    • basic_string::find()basic_string::rfind() 用于子字符串。
    • basic_string::rfind() 用于单个字符。
  • 合并的 C++23 缺陷报告:

    • P3107R5 允许 <print> 的高效实现。
    • P3235R3std::print 更多类型,更快速度,更少内存。
  • GitHub Copilot

    • GitHub Copilot Free 现已推出。 每月可免费获取 2,000 次代码补全和 50 次聊天请求。

    • GitHub Copilot 代码完成在编码时内联提供自动完成建议。 为了增强C++开发人员的体验,GitHub Copilot 包含其他相关文件作为上下文。 这样可以减少幻觉,同时提供更相关和准确的建议。

    • 现在,您可以从 Git 更改窗口请求 GitHub Copilot 的代码评审。

      “Git 更改”窗口的屏幕截图,其中突出显示了“GitHub Copilot 审阅”按钮。

      “Git 更改”窗口处于打开状态,其中突出显示了“GitHub Copilot 审阅”按钮。

      GitHub Copilot 查找潜在问题并为其创建注释:

      GitHub Copilot 解释问题的屏幕截图。

      GitHub Copilot 发现了代码行 if ( is_enabled_) new_site.disable() 存在问题。 它提到这可能是一个错误,正确的代码可能应为 if ( is_enabled_) new_site.enable(),因为其意图似乎是在启用断点的情况下启用新站点。

      若要使用此功能,请确保已启用以下各项:

      • 工具>选项>预览功能>拉取请求注释
      • 工具>选项>GitHub>Copilot>源代码管理集成>启用 Git 预览功能
    • GitHub Copilot 编辑是一项新功能,可在项目中的多个文件中进行更改。 若要启动新的编辑会话,请单击 GitHub Copilot Chat 窗口顶部 创建新的编辑会话

      GitHub Copilot 聊天窗口的屏幕截图。突出显示了“新建编辑会话”按钮。

      描述要进行的更改,Copilot 会建议进行相关编辑。 您可以逐一预览修改,并接受希望的修改或进行必要的更正。

      GitHub Copilot 聊天窗口的屏幕截图,其中显示了已编辑的文件。

      GitHub Copilot 显示其所做的更改摘要,例如 1。 在 include/libsdb/breakpoint.hpp" 和 2 中创建一个新的子类 range_breakpoint。 在 src/breakpoint.cpp 中实现range_breakpoint类。 将显示接受更改的选项。

      有关详细信息,请参阅使用 GitHub Copilot 编辑更高效地循环访问多个文件

  • CMake

    • 现在支持 CMake 预设 v9。 预设包含字段中的新宏扩展。 有关详细信息,请参阅官方 CMake 文档中 宏扩展

Visual Studio 版本 17.12 中 C++ 的新增功能

发布日期:2024 年 11 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.12 中面向 C++ 开发人员的新增功能
标准库 (STL) 合并了 C++26 和 C++23 功能、LWG 问题解决方法、性能改进、增强行为和修复的 bug STL 更改日志 17.12
Visual Studio 17.12 IDE 中的新增功能 Visual Studio 2022 版本 17.12 发行说明
Visual Studio 2022 17.12 中的 C++ 语言一致性改进 Visual Studio 2022 17.12 中的 C++ 一致性改进、行为更改和 bug 修复

简要介绍一些新功能:

  • 标准库增强功能
    • C++23 设置格式范围 (P2286R8) 实现完成。 为 stackqueuepriority_queue 的容器适配器添加了格式化程序。
    • 添加了多维下标运算符,该运算符也支持 <mdspan>。 例如:print("m[{}, {}]: '{}'; ", i, j, m[i, j])
  • C++ 中的游戏开发
  • 生成见解
    • 可以对选定的文件运行 Build Insights。 在解决方案资源管理器中选择所需的文件,右键单击并选择对选定的文件运行 Build Insights解决方案资源管理器中文件的屏幕截图。上下文菜单处于打开状态,并突出显示了“对选定的文件运行 Build Insights”选项。
    • 可以按项目筛选 Build Insights 结果。 单击筛选器列标题上的筛选器按钮,然后选择要查看结果的项目:打开“包含的文件”选项卡的“Build Insights”窗口的屏幕截图。已选择筛选器按钮,并显示项目列表。选中“两个项目”旁边的复选框。
    • 单击“Build Insights”窗口中的问号图标,查看“Build Insights”窗口选项卡的简短说明,以及详细说明的文档链接:“Build Insights”窗口的屏幕截图,其中突出显示了“视图说明”按钮(圆圈中的问号)。
  • GitHub Copilot
    • 可以单击变量值旁边的询问 Copilot,以获取 AI 驱动的见解,了解导致其当前状态的内容。 例如,以下程序的循环条件中出现了一个一位偏移错误:

    “自动”窗口的屏幕截图。命名它的变量为 NULL。旁边的“询问 Copilot”图标突出显示。

    导致此问题的代码是:for (auto it = h.animals_.begin(); it <= h.animals_.end(); it++)。

    当你单击 it 变量的“询问 Copilot”图标时,它会告诉你为什么 <NULL>

    GitHub Copilot 窗口的屏幕截图。

    此错误位于定义为 int calculate_number_of_cats(const house& h) 的函数内部。 GitHub Copilot 消息说:“表达式的值为 NULL,这意味着迭代器没有指向向量 animals_ 中的任何有效元素。 在程序的上下文中,它应该循环访问 house 对象中的 animals_ 向量来计算 cat 对象的数量。 为何为 null。 基于局部变量和调用堆栈上下文:house 对象 h 具有空 animals_向量 (size=0)。 循环条件 it <= h.animals_.end() 不正确。 应该是 != h.animals_.end()."

    • 可以单击询问 Copilot 了解关于 Visual Studio 错误列表中的错误,以获得有关错误的帮助和建议的修复方法。 例如:

    “错误列表”窗口的屏幕截图。

    “询问 Copilot”图标在 unique_ptr 试图引用已删除函数的错误旁边突出显示。

    如果单击“询问 Copilot”,它会告诉你有关错误的信息:

    GitHub Copilot 对错误的解释的屏幕截图。

    Copilot 消息注明:“发生错误的原因是基于范围的 for 循环尝试复制 std::unique_ptr 对象,这是不允许的,因为 std::unique_ptr 无法复制。 为了解决这个问题,我将循环更改为使用引用,以避免复制 std::unique_ptr 对象。 这样,循环访问对 std::unique_ptr 对象的引用,这是允许的。”

  • 调试
    • 用于 mutexrecursive_mutexmove_iterator 的新调试可视化工具。
    • 调试器现在以内联形式显示返回值:显示值 8.25 的工具提示的屏幕截图。它是被跳过的 return 语句后的表达式的结果。

Visual Studio 版本 17.11 中 C++ 的新增功能

发布日期:2024 年 8 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.11 中面向 C++ 开发人员的新增功能
标准库 (STL) 合并了 C++26 和 C++23 功能、C++20 缺陷报告、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.11
Visual Studio 17.11 IDE 中的新增功能 Visual Studio 2022 版本 17.11 发行说明
Visual Studio 2022 17.11 中的 C++ 语言一致性改进 Visual Studio 2022 17.11 中的 C++ 一致性改进、行为更改和 bug 修复

新功能的部分列表:

  • 标准库增强功能

    • 格式化的输出实现现在包括 std::range_formatter 以及 std::pairstd::tuple 的格式化程序。
    • 添加了对没有参数的 std::println() 的支持。 这将按照 P3142R0 中的建议打印空白行。
    • 改进了包括 replace_copy()replace_copy_if()ranges::replace_copyranges::replace_copy_iffind_first_of()ranges::find_first_of 在内的几种算法的矢量化,适用于 8 位和 16 位元素 mismatch()ranges::mismatchcount()ranges::countfind()ranges::findranges::find_lastranges::iota
  • C++ 中的游戏开发

    • 现在,可以在 Visual Studio 中添加常见的 Unreal Engine 类模板、模块和插件。 有关详细信息,请参阅在 Visual Studio 中添加 Unreal Engine 类、模块和插件
    • 新的 Unreal Engine 工具栏提供从 Visual Studio 中快速访问 Unreal Engine 相关操作的功能。 工具栏允许你快速附加到 Unreal Engine 进程、重新扫描蓝图缓存、快速访问 Unreal Engine 日志,并提供对 Visual Studio 的 Unreal Engine 配置页的快速访问。 有关详细信息,请参阅 Unreal Engine 工具栏
    • 现在,可以按项目筛选跟踪结果。 此外,每行中的结果显示相对路径和文件名,而不是完整路径。 包含的文视图中的结果分组也得到了改进:

    改进的“包含的文件”诊断结果的屏幕截图。

    “包含的文件”视图为项目新增了一列。 已选择“项目”列,并且选择了“全选”、“CompilerIdC”、“OpenAL”、“常用”等项目。 包含的文件按相对路径和文件名列出,并分组在一起。

  • CMake 调试

    • 现在,可以通过适用于 Linux 的 Windows 子系统 (WSL) 或 SSH 在 Visual Studio 调试器中调试面向 CMake 项目的 CMake 脚本和 CMakeLists.txt 文件。 若要在 Visual Studio 中启动 CMake 调试会话,请在 CMakeLists.txt 文件中设置断点,然后导航到项目>使用 CMake 调试配置缓存.。
  • GitHub Copilot

    • 将鼠标悬停在代码编辑器中的符号上时,单击“快速信息”对话框中的“Copilot 告诉我详细信息按钮,了解有关给定符号的详细信息:

    “快速信息”窗口的屏幕截图。

    “快速信息”窗口显示在函数上方。 突出显示了“告诉我详细信息”链接。

    • GitHub Copilot 可以根据标识符的使用方式和代码样式为标识符(变量、方法或类)生成命名建议。

      GitHub Copilot“重命名”对话框的屏幕截图。

      “重命名”对话框具有一个“新建名称”字段,其中有一个下拉列表,显示以下选项:text_color、font_color、display_color、console_color 和 menu_text_color。

    需要有效的 GitHub Copilot 订阅。 右键单击要重命名的变量,然后选择重命名Ctrl+RCtrl+R)。 选择 GitHub Copilot 闪烁图标以生成命名建议。

  • 调试

    • C++ 中的条件断点速度更快。
  • 诊断改进

    • 改进了在模板参数中有多个 T 实例的 std::tuple 上调用 std::get<T> 时的诊断。 MSVC 过去报告:
      error C2338: static_assert failed: 'duplicate type T in get<T>(tuple)'
      现在它报告:
      error C2338: static_assert failed: 'get<T>(tuple<Types...>&) requires T to occur exactly once in Types.(N4971 [tuple.elemm]/5)'
    • 改进了当 std::ranges::to 无法构造请求的结果时的诊断。 MSVC 过去报告:
      error C2338: static_assert failed: 'the program is ill-formed per N4950 [range.utility.conv.to]/2.3'
      现在它报告:
      error C2338: static_assert failed: 'ranges::to requires the result to be constructible from the source range, either by using a suitable constructor, or by inserting each element of the range into the default-constructed object. (N4981 [range.utility.conv.to]/2.1.5)'

Visual Studio 版本 17.10 中 C++ 的新增功能

发布日期:2024 年 5

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.10 中面向 C++ 开发人员的新增功能
标准库 (STL) 合并了 C++26 和 C++23 功能、C++20 缺陷报告、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.10
Visual Studio 17.10 IDE 中的新增功能 Visual Studio 2022 版本 17.10 发行说明
Visual Studio 2022 17.10 中的 C++ 语言一致性改进 Visual Studio 2022 17.10 中的 C++ 一致性改进、行为更改和 bug 修复

新功能的部分列表:

  • MSVC 工具集更新:MSVC 工具集版本已从 19.39 更新到 19.40。 这可能会影响具有版本假设的项目。 有关影响项目(假定 MSVC 版本均为 Visual Studio 2022 版本的 19.3X)的某些方式的详细信息,请参阅 VS 2022 v17.10 中的 MSVC 工具集次要版本号 14.40
  • 标准库增强功能:标准库添加了对 P2510R3 格式设置指针的支持,这使得在使用 std::format 时指针的格式说明符集与已经存在的整数格式说明符更加一致。 改进了 std::min_elementstd::ranges::min 和友元的矢量化实现。
  • Build Insights:现在会提供模板实例化信息。 请参阅 Visual Studio 中 Build Insights 的模板视图纯虚拟 C++ - Visual Studio 中 Build Insights 的模板视图录像。
  • Unreal Engine 插件:Unreal Engine 插件有一个新的选择加入功能,该功能在后台运行,可以降低启动成本。 这是一项选择加入功能,可通过工具>选项>Unreal Engine 来激活。
  • 适用于 Linux 的新功能:请参阅 Visual Studio 中新增的 Linux 开发功能
  • CMake 目标:现在可以在 CMake 目标视图中固定目标。
  • 连接管理器用户体验:在连接到远程系统时,用户体验提供更顺畅的体验。 有关详细信息,请参阅 Visual Studio 连接管理器中的可用性改进
  • 拉取请求注释:现在可以直接在工作文件中查看 GitHub 和 Azure DevOps 注释。 在选项>环境>预览版功能中启用功能标志拉取请求注释,并签出拉取请求分支以开始使用。
  • AI 生成的内容:GitHub Copilot 现在可以起草拉取请求说明。 需要一个活动的 GitHub Copilot 订阅。 通过单击“创建拉取请求”窗口中的“添加 AI 生成的拉取请求描述”闪光笔图标来试用。
  • 图像预览:将鼠标悬停在图像路径上以查看包含大小详细信息的预览。 大小上限为 500 像素宽和高。

    悬停预览的屏幕截图。

    鼠标悬停在行 std::filesystem::path vs_logo_path = "../images/vs_logo.png" 上。 下面显示了 Visual Studio 徽标的预览,以及其大小为 251 x 500 像素和 13.65 KB 的信息。

  • 断点/跟踪点创建:现在,你可以从右键单击菜单直接从源代码中的表达式创建条件断点或跟踪点。 这适用于自动、局部变量、监视窗口或数据提示中的属性或字段名称和值。
  • “附加到进程”对话框:“附加到进程”对话框提供的功能对用户更加友好。 现在可轻松地在树视图和列表视图之间切换,使用可折叠部分更好地组织流程,并使用简化的组合框选择代码类型。 此外,“选择/跟踪窗口”功能现在更易于使用,支持双向跟踪,选择进程会突出显示其窗口,而单击窗口可选择其进程。
  • GitHub Copilot 集成:GitHub Copilot 和 Copilot Chat 扩展现已统一,现在直接在 Visual Studio 中发布。 若要安装它,请在 Visual Studio 安装程序 中安装 GitHub Copilot组件:

    Visual Studio 安装程序 GitHub Copilot 安装选项的屏幕截图。

    GitHub Copilot 界面位于 Visual Studio 的右上角。 若要使用它,你需要一个活动的 GitHub Copilot 订阅。

    GitHub Copilot 按钮的屏幕截图。

    GitHub Copilot 按钮显示在 Visual Studio 的右上角。 它具有打开聊天窗口、进行 GitHub Copilot 设置、了解详细信息和管理 Copilot 订阅的选项。

Visual Studio 版本 17.9 中 C++ 的新增功能

发布日期:2024 年 2 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.9 中面向 C++ 开发人员的新增功能
标准库 (STL) 合并了 C++23 功能、性能改进,增强的行为、LWG 问题解决方法和修复的 bug STL 更改日志 17.9
Visual Studio 17.9 IDE 中的新增功能 Visual Studio 2022 版本 17.9 发行说明
Visual Studio 2022 17.9 中的 C++ 语言一致性改进 Visual Studio 2022 中的 C++ 一致性改进、行为更改和 bug 修复
C++ 后端更新摘要 自 Visual Studio 2022 版本 17.3 起的 MSVC 后端更新

新功能的部分列表:

  • #include 诊断,它提供对 #include 指令的详细分析。 通过右键单击 #include 并选择 #include 指令>启用 #include 指令诊断来激活此功能。 在每个 #include 上方会显示你的代码引用该 #include 文件的次数。 单击引用链接可导航到你的代码中使用该头文件中内容的位置。 若要查看 #include 指令的生成时间,请通过导航到生成>对解决方案运行 Build Insights>生成来运行 Build Insights。

    #include 诊断的屏幕截图。

    在 #include 上方是一个“引用”链接和对此 #include 文件的许多引用(在本例中为 1)。 还会列出生成时间(在本例中小于 1/2 秒)。

  • 内存布局可视化效果,这会显示为你的类、结构和联合安排的内存情况。 将鼠标指针悬停在某个类型上并选择“快速信息”中的“内存布局”链接可以打开一个专用窗口,其中会显示所选类型的内存布局。 将鼠标指针悬停在此窗口中的各个数据类型上会提供有关其大小和偏移量的详细信息。

    内存布局窗口的屏幕截图

    内存布局窗口显示了 Snake 类的内容。 它显示类的各个字段的内存偏移量,例如,表示头部和身体的位置的 Point 类、分数,等等。

  • 你现在可以指定自己的自定义 CMake 可执行文件。 如果你要使用 Visual Studio 中未附带的特定 CMake 版本,则此功能非常有用。 导航到工具>选项,然后选择 CMake>常规。 选择“启用自定义 CMake 可执行文件”并指定你的 CMake 可执行文件的目录路径。

    “CMake 选项”对话框的屏幕截图

    CMake 选项对话框,其中突出显示了“启用自定义 CMake 可执行文件”选项和“CMake 可执行文件目录”字段。

  • 改进了 Unreal Engine 项目的 IntelliSense
  • 改进了 C++23 支持:根据 P0009R18 改进了作为 P2286R8 格式设置范围<mdspan>的一部分的 std::formatstd::spanformattablerange_formatformat_kind 以及 set_debug_format(),以及应用于 C++23 标准的后续措辞更改。 另外,format() 可以根据 P2510R3 设置指针格式。

Visual Studio 版本 17.8 中 C++ 的新增功能

发布日期:2023 年 11 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.8 中面向 C++ 开发人员的新增功能
标准库 (STL) 合并了 C++26、C++23 功能、C++20 扩展、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.8
Visual Studio 17.8 IDE 中的新增功能 Visual Studio 2022 版本 17.8 发行说明
Visual Studio 2022 17.8 中的 C++ 语言一致性改进 Visual Studio 2022 中的 C++ 一致性改进、行为更改和 bug 修复
2023 年 Visual Studio、VS Code 和 vcpkg 中的 C++ 改进概述 C++ 改进的一年

新功能的部分列表:

  • “输出”窗口中的 C++ 结构化诊断,以及一个新的问题详细信息窗口,该窗口提供有关错误的详细信息。 有关详细信息,请参阅《结构化 SARIF 输出》和《问题详细信息窗口》。
  • 一项功能,可让你在编译代码之前可视化类、结构、联合、基类型或枚举的大小和对齐方式。 将鼠标悬停在标识符上,“快速信息”将显示大小和对齐信息。
  • 一项功能,建议何时标记成员函数 const,因为它们不会修改对象的状态。 将鼠标悬停在成员函数上,然后单击灯泡图标将函数标记为 const
  • Visual Studio 现在提示你通过函数名称旁边显示的螺丝刀图标将全局函数标记为静态。 单击螺丝刀图标将函数标记为静态。
  • 未使用的 #include 指令在编辑器中灰显。 可以将鼠标悬停在灰显的 include 上,并使用灯泡菜单删除该 include 或所有未使用的 include。 你还可以为通过其他标头间接包含的实体添加 #include 指令。 有关详细信息,请参阅《在 Visual Studio 中清除 C/C++ Include》。
  • 更多 Unreal Engine 支持:
    • Unreal Engine 测试适配器允许你发现、运行、管理和调试 Unreal Engine 测试,而无需离开 Visual Studio IDE。
    • 使用 Unreal Engine 代码片段,可以在成员列表中找到作为代码片段的常见的 Unreal Engine 构造。
    • Build Insights 现已与 Visual Studio 2022 集成,并使用 MSVC 处理 MSBuild 和 CMake 项目。 你现在可以查看有关函数编译的其他信息,例如编译所花费的时间和 ForceInline 的数量,以及头文件对生成时间的影响。 有关详细信息,请参阅教程:排查影响生成时间的函数内联教程:排查头文件对生成时间的影响
  • 远程 Linux 单元测试支持现在允许从 Visual Studio 的测试资源管理器在远程 Linux 计算机上运行 CTest 和 GTest 测试,就像本地测试一样。

Visual Studio 版本 17.7 中的 C++ 新增功能

发布日期:2023 年 8 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.7 中面向C++开发人员的新增功能
特定于游戏开发的新增 C++ 功能 释放 Visual Studio 2022 进行 C++ 游戏开发的能力
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.7
Visual Studio 17.7 IDE 中的新增功能 Visual Studio 2022 版本 17.7 发行说明
Visual Studio 2022 17.7 中的 C++ 语言一致性改进 Visual Studio 2022 中的 C++ 一致性改进、行为更改和 bug 修复

新功能的部分列表:

  • 更快的调试会话和更快的项目加载速度
  • 宏扩展的分步可视化
  • 适用于 Linux 的 Windows 子系统 (WSL) 的一键式下载
  • 改进了对 Doxygen 注释的支持
  • 用于游戏开发的 C++ 生成见解
  • 已为 C 编译器添加 /std:clatest
  • Unreal Engine 项目改进,例如更快的 IntelliSense 和语法着色、查找所有 Unreal Engine 蓝图引用的功能等。

Visual Studio 版本 17.6 中的 C++ 新增功能

发布日期:2023 年 5 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.6 中面向C++开发人员的新增功能
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.6
Visual Studio 17.6 IDE 中的新增功能 Visual Studio 2022 版本 17.6 发行说明
Visual Studio 2022 17.6 中的 C++ 语言一致性改进 Visual Studio 2022 中的 C++ 一致性改进、行为更改和 bug 修复

新功能的部分列表包括:

  • CMake 脚本调试
  • 对 High Level Shading Language (HLSL) 的内置支持
  • Unreal Engine 日志查看器
  • 现在会默认添加 VCPKG
  • C++/CLI 项目中对 C++20 的初始支持,以及适用于范围的一些 C++23 标准库功能。

Visual Studio 版本 17.5 中 C++ 的新增功能

发布日期:2023 年 2 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.5 中面向C++开发人员的新增功能
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.5
Visual Studio 17.5 IDE 中的新增功能 Visual Studio 2022 版本 17.5 发行说明

新功能的部分列表包括:

  • std::movestd::forwardstd::move_if_noexceptstd::forward_like 现在不会在生成的代码中生成函数调用,即使在调试模式下也是如此。 此更改可避免命名强制转换在调试版本中导致不必要的开销。 /permissive-(或表示它的选项,例如 /std:c++20std:c++latest)是必需的。

  • 已添加 [[msvc::intrinsic]]。 你可以将此属性应用于由单个强制转换组成的非递归函数,该函数仅采用一个参数。

  • 在允许终端 I/O 的集成终端中添加了对 Linux 控制台的支持。

  • 添加了对 C11 原子基元 (<stdatomic.h>) 的初始实验性支持。 可在 /std:c11 模式或更高版本中使用 /experimental:c11atomics 选项来启用此实验性功能。

  • 向生存期检查器添加了一组新的实验性高置信度检查,以减少干扰。

  • 一个新的预览功能“远程文件资源管理器”,可让你在 VS 中查看远程计算机上的文件目录,并可在其中上传和下载文件。

  • 更改了 Visual Studio 随附的 CMake 可执行文件的版本控制,以与 Kitware 版本匹配。

  • 向 CMake 项目模板添加了对热重载的支持。

  • C++ 的“转到定义”现在使用更精细的指示器,表明操作需要更多的时间,取代了以前版本中的模式对话框。

  • 已开始推出一项试验,在 C++ 自动完成和成员列表中提供更多智能结果。 此功能以前称为“预测 IntelliSense”,但现在使用一种新的表示方法。

  • 我们现在提供带 LLVM 工作负载的本机 Arm64 Clang 工具集,允许在 Arm64 计算机上进行本机编译。

  • 添加了图像查看扩展的本地化(此扩展在市场中提供,并且未通过 Visual Studio 安装程序捆绑)。

  • 添加了在当前运行的开发人员容器中打开终端窗口的支持。

  • 对 IntelliSense 宏扩展进行了多项改进。 值得注意的是,我们在更多上下文中启用了递归扩展,并在弹出窗口中添加了将扩展复制到剪贴板或内联扩展宏的选项。

  • 串行监视器现在支持并发监视。 并发监视允许同时并排监视多个端口。 按加号按钮可打开另一个串行监视器并开始使用。

  • 现在可以查看在 Unreal Blueprint 资产中修改的基类的属性,而无需退出 Visual Studio。 双击 C++ 类或属性的蓝图引用,在 Visual Studio 中打开 UE 资产检查器。

  • 在远程 Linux 计算机上启用了运行中的 DevContainers。

  • 在 CMake 目标视图中选择了要构建的多个目标。

  • 添加了对 CMakePresets.json 版本 5 的支持。 有关新功能的信息,请参阅 CMake 文档

  • 启用了测试资源管理器以并行生成和测试多个 CMake 目标。

  • 在开发容器中添加了“在终端中打开容器”选项。

  • 实现了标准库功能:

    • P2508R1basic_format_stringformat_stringwformat_string
    • P2322R6ranges::fold_leftranges::fold_right 等等。
    • P2321R2views::zip(不包括 zip_transformadjacentadjacent_transform

Visual Studio 版本 17.4 中 C++ 的新增功能

发布日期:2022 年 11 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.4 中面向C++开发人员的新增功能
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.4
Visual Studio 17.4 IDE 中的新增功能 Visual Studio 2022 版本 17.4 发行说明
Visual Studio 2022 17.4 中的 C++ 语言一致性改进 Visual Studio 2022 中的 C++ 一致性改进、行为更改和 bug 修复

17.4 中新功能的部分列表:

  • 改进了编译器错误消息,以提供更正确和有用的信息,尤其是对于概念。

  • 添加了实验性 MSVC 选项 /experimental:log<directory>,将结构化 SARIF 诊断输出到指定目录。

  • 向 IntelliSense 添加了对 C23 属性的支持,并在 C++20 模块支持中继续取得进展。

  • 改进了打开新解决方案时的编制索引性能。 大型项目可以在 17.3 的基础上提高 20-35%。

  • 改进了命名返回值优化 (NRVO):

    • NRVO 针对涉及异常处理或循环的情况启用。
    • 如果用户传递 /Zc:nrvo 选项、/std:c++20 或更高版本或 /permissive-,则即使在 /Od 下也启用 NRVO。
    • 现在可以使用 /Zc:nrvo- 选项禁用 NRVO。
  • 已将 Visual Studio 随附的 LLVM 版本升级到 15.0.1。 有关可用功能的详细信息,请参阅 LLVMClang 发行说明。

  • 已使用 CMake 项目为 Visual Studio 添加了对 vcpkg 项目的支持。 对于包含 vcpkg 清单的项目,会在项目打开时自动激活环境。 在 Visual Studio 博客文章中的 vcpkg 环境激活中了解有关此功能的详细信息。

  • 现在,可以将开发容器用于 C++ 项目。 在 适用于 C++ 的开发容器博客文章中了解有关此功能的详细信息。

  • 当预先包含标头中有一个为 PCH 时,IntelliSense 现在遵循预先包含标头的顺序。 以前,当通过 /Yu 使用 PCH 并通过 /FI 强制包含它时,IntelliSense 将始终先处理它,然后再处理通过 /FI 包含任何其他标头。 此行为与生成行为不匹配。 进行此更改后,/FI 标头将按照指定的顺序进行处理。

  • 从测试资源管理器中的 CTest 名称中删除了内部前缀。

  • 将 Visual Studio 随附的 CMake 版本升级到了版本 3.24.1。 有关可用功能的详细信息,请参阅 CMake 发行说明

  • Android SDK 更新:

    • Ant 脚本已删除,因此用户不会再在“新建项目”对话框中看到基于 Ant 的模板。 有关从 Ant 模板迁移到 Gradle 模板的帮助,请参阅从 Apache Ant 迁移生成
    • 添加了对使用 NDK 23 和 24 生成的支持
    • 已将 NDK 组件更新到 LTS 版本 23
  • 添加了 ranges::min_element()ranges::max_element()ranges::minmax_element() 的矢量化实现

  • 我们将继续跟踪 C++ 标准化的最新发展。 可通过在编译器选项中包括 /std:c++latest 来提供对这些 C++23 功能的支持:

    • P2302R4ranges::containsranges::contains_subrange

    • P2499R0string_view 范围构造函数应为 explicit

    • P0849R8auto(x):语言中的衰减复制

      (编译器部件尚未实现。最初实现范围支持时,库部件是在 C++20 模式下实现的。)

    • P0881R7<stacktrace>

    • P2301R1 添加 std::stacktracepmr 别名

    • P1328R1constexpr type_info::operator==()

    • P2440R1ranges::iotaranges::shift_leftranges::shift_right

    • P2441R2views::join_with

  • 添加了“创建声明/定义后导航”选项,允许你选择“创建声明/定义”功能的导航行为。 可以在速览(默认)或打开文档或无导航之间进行选择。

  • Visual Studio 的 Arm64 版本现在绑定了 CMake 和 Ninja 的 Arm64 版本。

  • 添加了对 CMake 预设版本 4 的支持。 有关可用功能的详细信息,请参阅 CMake 发行说明

  • 使用连接管理器的远程系统连接现在支持 SSH ProxyJump。 ProxyJump 用于通过另一个 SSH 主机访问 SSH 主机(例如,访问防火墙后面的主机)。

Visual Studio 版本 17.3 中 C++ 的新增功能

发布日期:2022 年 8 月

有关 请参阅
面向 C++ 开发人员的新增功能 17.3 中的 C++ 改进
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.3
Visual Studio 17.3 IDE 中的新增功能 Visual Studio 2022 版本 17.3 发行说明
Visual Studio 2022 17.3 中的 C++ 语言一致性改进 Visual Studio 2022 中的 C++ 一致性改进、行为更改和 bug 修复

17.3 中新功能的部分列表:

  • Arm64EC 工具链不再标记为实验性,已可供生产使用。
  • Visual Studio 终端现在可作为 SSH 客户端与存储的 SSH 连接一起使用。 安装适用于 Linux 工具的 C++ 后,打开终端工具窗口。 终端下拉列表将填充存储的连接。 选择连接时,将在 Visual Studio 中打开一个新的终端窗口,其中显示远程系统上的伪终端。 控制字符、颜色和光标位置感知都受支持。
  • Visual Studio 现在可以为 UE 项目添加 Unreal Engine 类模板。 若要试用此功能,请确保 Visual Studio 安装程序中的“使用 C++ 的游戏开发”工作负载中选择了“针对 Unreal Engine 的 IDE 支持”。 处理 UE 项目时,右键单击项目或文件夹/筛选器,然后选择添加>UE 类
  • 现在,转到定义将记住以前的签名,并在没有更好的匹配项(例如,手动更改其中一对签名)时进行相应导航。 提高了“转到全部”的响应速度。 以前,结果要在停止键入后才会显示。 在新体验中,键入时就会显示结果。
  • 在需要 enum 类型完成(例如 enum 变量、case 标签、返回 enum 类型等的赋值)的上下文中,自动完成列表现在仅筛选匹配的枚举器和相关构造。
  • 为面向 .NET Core 的 C++/CLI MSBuild 项目添加了 NuGet PackageReference 支持。 进行此更改是为了解决混合代码库无法采用 .NET Core 的障碍。 此支持不适用于其他 C++ 项目类型或任何面向.NET Framework 的 C++ 项目类型。 目前没有计划将 PackageReference 支持扩展到其他 C++ 方案。 团队正在为非 MSBuild 方案开发涉及 vcpkg 的单独体验,并添加更强大的功能。
  • 为嵌入式开发添加了串行监视器窗口,可通过调试>Windows>串行监视器找到。
  • 与 17.2 相比,C++ 索引提高了约 66%。
  • 将 Visual Studio 随附的 CMake 版本升级到了版本 3.23。 有关可用内容的详细信息,请参阅 CMake 3.23 发行说明
  • 将 Visual Studio 随附的 LLVM 工具版本升级到了 v14。 有关可用内容的详细信息,请参阅 LLVMClang 发行说明。
  • 将并行 Dev 16.11 C++ 工具集更新到了版本 14.29.30145.00。 最新版本的 Dev 16.11 C++ 工具集包含重要的 bug 修补程序,包括修复所有剩余的 C++20 缺陷报告。 有关 bug 修复的详细信息(包括 Dev 16.11 中的 C++20 缺陷报告),请参阅 Visual Studio 2019 版本 16.11.14 发行说明
  • 我们对 C++ 模块的编辑器内体验进行了各种改进。 我们正在不断努力提高体验的质量,鼓励你试用 17.3。 通过开发者社区报告存在的问题。

Visual Studio 版本 17.2 中 C++ 的新增功能

发布日期:2022 年 5 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.2 现已推出
标准库 (STL) 合并了 C++20 缺陷报告、C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.2
Visual Studio 17.2 IDE 中的新增功能 Visual Studio 2022 版本 17.2 发行说明
Visual Studio 2022 17.2 中的 C++ 语言一致性改进 Visual Studio 2022 中的 C++ 一致性改进、行为更改和 bug 修复

17.2 中新功能的部分列表:

  • 添加了对 C++23 功能 deducing this 的编译器支持(可在 /std:c++latest 选项下使用)。
  • 添加了对 C++23 功能 deducing thisif consteval 的 IntelliSense 支持。
  • 添加了内联参数名称和类型提示支持(通过按 Alt+F1 或双击 Ctrl 进行切换)。 可以在“工具”>“选项”>“文本编辑器”>“C/C++”>“IntelliSense”下自定义此行为。
  • 在 CMake 项目中添加了对 C++20 模块的实验性支持。 此支持目前仅适用于 Visual Studio (MSBuild) 生成器。
  • 在 17.1 中,我们为嵌入式开发人员引入了外围寄存器和 RTOS 视图。 我们会在 17.2 中提高可用性,从而继续改进这些视图的功能:
    • RTOS 工具窗口现在默认处于隐藏状态。 未使用 RTOS 时,它可以阻止显示带有不相关错误消息的工具窗口。
    • 在工具窗口中双击 RTOS 对象时,它会为该对象添加监视。
    • 在 RTOS 工具窗口中选择堆栈指针的开始值和结束值时,它会在内存窗口中打开。
    • 我们已将设备目标的线程感知添加到调用堆栈窗口。
    • 用户现在可以选择外围设备、寄存器或字段旁边的固定图标,将它们固定到外围设备视图的顶部。
  • 我们添加了其余 C++20 缺陷报告(也称为“后移植”)的实现。 所有 C++20 功能现已在 /std:c++20 选项下提供。 有关实现的后移植的详细信息,请参阅 Microsoft/STL GitHub 存储库中的 C++20 缺陷报告项目以及 MSVC 的 STL 完成 /std:c++20 博客文章。
  • 我们添加了各种 C++23 库功能,位于 /std:c++latest 选项下。 有关新功能的详细信息,请参阅 STL 存储库更改日志
  • 根据包含图的深度,将初始 C++ 索引的性能提高了 20%。

Visual Studio 版本 17.1 中 C++ 的新增功能

发布日期:2022 年 2 月

有关 请参阅
面向 C++ 开发人员的新增功能 Visual Studio 2022 17.1 现已推出!
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.1
Visual Studio 17.1 IDE 中的新增功能 Visual Studio 2022 版本 17.1 发行说明
Visual Studio 2022 17.1 中的 C++ 语言一致性改进 Visual Studio 2022 中的 C++ 一致性改进、行为更改和 bug 修复

17.1 中新功能的部分列表:

  • 添加了新的“配置预设”模板,以使用 CMakePresets.json 在远程 macOS 系统上配置和生成 CMake 项目。 此外,还可以在远程 macOS 系统上启动 CMake 目标,然后使用由 GDB 或 LLDB 提供支持的 Visual Studio 调试程序进行远程调试。
  • 现在,可以使用 LLDB 或 GDB 在 Visual Studio 中调试远程 macOS 系统上的核心转储。
  • Visual Studio 附带的版本 ClangLLVM 升级到 v13。
  • Visual Studio 的 CMake 集成仅当在开放工作区根目录中识别到 CMakeLists.txt 时激活。 如果在该工作区的其他级别识别到 CMakeLists.txt,则系统会通过发出一条通知来提示你激活 Visual Studio 的 CMake 集成。
  • 可用于检查微控制器上的外围寄存器以及实时操作系统 (RTOS) 对象并与之交互的新视图(可通过依次选择调试>Windows>嵌入式寄存器找到这些视图)
  • 为 RTOS 项目添加了一个新的线程视图,可通过调试>窗口>RTOS 对象访问该视图。 有关详细信息,请参阅 Visual Studio 中的嵌入式软件开发

Visual Studio 版本 17.0 中 C++ 的新增功能

发布日期:2021 年 11 月

有关 请参阅
Visual Studio 17.0 IDE 中的新增功能 Visual Studio 2022 版本 17.0 发行说明
标准库 (STL) 合并了 C++23 和 C++26 功能、C++20 缺陷报告、LWG 问题解决方法、性能改进、增强的行为和修复的 bug STL 更改日志 17.0
Visual Studio 2022 17.0 中的 C++ 语言一致性改进 Visual Studio 2022 17.10 中的 C++ 一致性改进、行为更改和 bug 修复

Visual Studio 2022 版本 17.0 中的一些新增功能概述:

  • Visual Studio IDE devenv.exe 现在是本机 64 位应用程序。
  • MSVC 工具集现在默认为调试记录中的 SHA-256 源哈希。 以前,工具集默认使用 MD5 进行源哈希处理。
  • v143 生成工具现可通过 Visual Studio 安装程序使用,也可在独立的生成工具中使用。

本机 C++ 的热重载

  • 借助 C++ 的热重载,可对正在运行的应用进行多种类型的代码编辑,并且无需使用断点等暂停应用执行就可应用这些更改。

在 Visual Studio 2022 中,当你在调试器中启动应用程序时,可以使用“热重载”按钮在应用程序仍在运行时对其进行修改。 此体验由本机“编辑并继续”提供支持。 有关受支持编辑的详细信息,请参阅编辑并继续 (C++)

  • 热重载支持 CMake 和 Open Folder 项目。

WSL2 支持

  • 现在无需建立 SSH 连接即可在 WSL2 上进行本机生成和调试。 跨平台的 CMake 项目和基于 MSBuild 的 Linux 项目均受支持。

经过改进的 CMake 支持

  • 我们将 Visual Studio 附带的 CMake 版本升级到了版本 3.21。 若要详细了解此版本提供的功能,请参阅 CMake 3.21 发行说明

  • 已更新 CMake 概述页面,现支持 CMakePresets.json

  • 现可使用 CMake 3.21 和 CMakePresets.json v3 配置和生成 CMake 项目。

  • Visual Studio 现在支持在 CMakePresets.json 中使用 buildPresets.targets 选项。 此选项使你能够在 CMake 项目中生成目标的子集。

  • CMake 项目中的“项目”菜单已经过简化,显示“删除缓存并重新配置”和“查看缓存”选项。

  • 实施了 /scanDependencies 编译器选项以列出 CMake 项目的 C++20 模块依赖项,如 P1689R5 中所述。 这步举措旨在支持使用 CMake 生成基于模块的项目,我们正努力在更高版本中完成此支持。

标准库改进

此处突出显示了选择标准库 (STL) 改进。 有关新功能、更改、bug 修复和性能改进的完整列表,请参阅 STL 团队的 Changelog

  • 添加了调试可视化工具以改善以下类型的显示方式:source_locationbind_front()u8string(及其迭代器)、default_sentinel_tunreachable_sentinel_tranges::empty_viewranges::single_viewranges::iota_view(及其迭代器/sentinel)、ranges::ref_viewthreadthread::idjthreadfilesystem::path
  • <string> 中的 stoi() 系列函数和 <locale> 中的各种函数(如 collate 成员函数)、has_facet() 以及 isalnum()tolower() 系列函数中添加了 [[nodiscard]]
  • P0980R1std::stringconstexpr 合并到 VS 2019 16.10。 现在支持 Clang。
  • P1004R2std::vectorconstexpr 合并到 VS 2019 16.10。 现在支持 Clang。

突出显示了 C++23 功能

  • P1048R1 添加了 is_scoped_enum,这是 C++ 标准库的一个新特性,可以检测某个类型是否为区分范围的枚举。
  • P1132R7out_ptr()inout_ptr()
  • P1679R3contains() 适用于 basic_stringbasic_string_view
  • P1682R3to_underlying() 适用于枚举
  • P2162R2 允许继承自 std::variant
  • P2166R1 禁止从 nullptr 构造 basic_stringbasic_string_view。 这是一项源中断性变更。 以前在运行时具有未定义行为的代码现在会被拒绝并出现编译器错误。
  • P2186R2 已删除垃圾回收支持。 此更改将删除 declare_reachableundeclare_reachabledeclare_no_pointersundeclare_no_pointersget_pointer_safety。 以前,这些函数不起作用。

突出显示了性能改进

  • <format> 现在可以检测到它何时写入到 basic_stringvectorback_insert_iterator 中,并在容器的 end() 处对 insert() 进行更快的调用。
  • vector<bool>std::find()std::count() 的性能提高了 19 倍和 26 倍(注意是倍数,不是百分数)。
  • 提高了 vector<bool>std::count() 的性能
  • std::byte 现在的性能与 reverse()variant::swap()unsigned char 的性能相同

Clang 和 LLVM 支持

  • Visual Studio 附带的 LLVM 工具已升级到 LLVM 12。 有关详细信息,请参阅 LLVM 发行说明

  • Clang-cl 支持已更新到 LLVM 12。

  • 现可使用 LLDB 从 Visual Studio 调试在远程系统上运行的进程。

C++ AMP 已弃用

  • C++ AMP 标头现已弃用。 在 C++ 项目中添加 <amp.h> 会导致出现生成错误。 若要禁止提示错误,请定义 _SILENCE_AMP_DEPRECATION_WARNINGS。 有关详细信息,请参阅 AMP 弃用链接

IntelliSense 改进

  • 改进了 C++ IntelliSense,为导入的模块和标头单元中的类型提供了导航和语法突出显示功能。 IntelliSense 是我们积极投入的一个方面。 请帮助我们改进:在开发人员社区通过帮助>发送反馈来分享你的反馈。
  • 通过优化缓存标头使用情况和对符号数据库的访问,以及通过提升进入代码的访问速度,改进了 C++ IntelliSense 的性能。
  • IntelliSense Code Linter for C++ 现在默认为启用状态,提供对常见代码缺陷的即时建议和修复建议。
  • 现在,在使用带有显示名称的预设时,可使用 C++ IntelliSense for CMake 项目。

C++ 工作负载更新

  • 已更新到 C++ 移动开发工作负载中的 NDK r21 LTS
  • 使用 C++ 工作负载的游戏开发现在安装了支持 Visual Studio 2022 的最新 Unreal Engine

代码分析改进

  • 代码分析现在强制检查用 _Check_return__Must_inspect_result_ 批注的函数的返回值。
  • 改进了代码分析工具中的空指针取消引用检测。
  • 添加了对 gsl::not_null 的支持以进行代码分析。
  • 支持 /fsanitize=fuzzer 编译器选项下的 Libfuzzer。

旧版本的发行说明

还提供了 C++ 先前版本的发行说明:

已知问题

C++ IntelliSense

若要详细了解 Visual Studio 2022 中关于 C++ 的其他待解决问题和可用解决方法,请参阅 C++ 开发者社区问题列表

反馈和建议

我们希望听到您的意见! 可使用安装程序或 Visual Studio IDE 右上角的“发送反馈”图标,或者通过帮助>发送反馈报告问题或提出功能建议。 可在 Visual Studio 开发者社区跟踪你的问题,也可在这里添加评论和查找解决方案。 此外,还可通过实时聊天支持获得免费安装帮助。

博客

充分利用 Microsoft 开发人员博客网站中提供的见解和建议,及时了解所有新版本。 这些博客包括对各种功能的深度探讨。 C++ 团队博客Visual Studio 博客尤其令人感兴趣。