Visual Studio 2019 中 C++ 的新功能

Visual Studio 2019 有多個 Microsoft C++ 環境的更新與修正。 我們已修正編譯器和工具中的許多錯誤 (Bug) 與問題。 其中多是客戶透過 [傳送意見反應] 底下的 回報問題提供建議 選項提交而來。 感謝您回報 Bug!

如需有關所有 Visual Studio 新功能的詳細資訊,請瀏覽 Visual Studio 2019 的新功能。 如需有關 Visual Studio 2017 中 C++ 新功能的資訊,請參閱 Visual Studio 2017 中 C++ 的新功能。 如需有關 Visual Studio 2015 和更舊版本中 C++ 新功能的資訊,請參閱從 2003 到 2015 的 Visual C++ 新功能。 如需詳細資訊,請參閱 Microsoft C++ 檔:新功能

Visual Studio 16.11 版的 C++ 新功能

如需 Visual Studio 16.11 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.11 版的新功能。

  • 編譯程式現在支援 /std:c++20 編譯程式模式。 先前,C++20 功能只能在 Visual Studio 2019 的模式中使用 /std:c++latest 。 原本需要 /std:c++latest 模式的功能現在可在 /std:c++20 最新版 Visual Studio 的模式或更新版本中運作。

  • Visual Studio 隨附的 LLVM 工具已升級至 LLVM 12。 如需詳細資訊,請參閱 LLVM 版本資訊

  • Clang-cl 支援已更新為 LLVM 12。

Visual Studio 16.10 版中 C++ 的新功能

如需 Visual Studio 16.10 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.10 版的新功能。

  • 所有 C++20 功能現在都可在 下 /std:c++latest取得。 雖然 MSVC 的 C++20 標準實作(目前由 ISO 發佈)功能已完成,但即將推出的瑕疵報告(ISO C++20 Bug 修正)預期會修改一些重要的 C++20 連結庫功能,這些功能可能會以 ABI 不相容的方式加以變更。 如需詳細資訊,請參閱 Microsoft/STL 問題 #1814

    • C++20 立即函式和 constinit 支援已於 16.10 中新增
    • 最後的 <chrono>片段:新的時鐘、閏秒、時區和剖析
    • 文字格式設定的 實 <format>
  • 除了 x64 之外,x86 和 ARM64 現在也提供 /openmp:llvm

  • 現在可以使用自訂的編譯警告層級和程式碼分析設定,將 Include 目錄指定為外部目錄。

  • /await:strict已新增選項,以在舊版語言模式中啟用 C++20 樣式協同程式。

  • std::coroutine_handle<T> 的偵錯工具視覺效果現在會顯示原始協同程式函式名稱和簽章,以及目前的暫止點。

  • 已新增 CMakePresets 的支援。

  • 您現在必須在Visual Studio中新增遠端連線時,接受或拒絕伺服器所提供的主機密鑰指紋。

  • 已將 /external 參數新增至 Microsoft Visual C++,以指定應該視為外部的標頭,以供警告之用。

Visual Studio 16.9 版的 C++ 新功能

如需 Visual Studio 16.9 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.9 版的新功能。

  • 位址清理工具

    • 我們在 Windows 上的位址清理器支援已脫離實驗模式,且已達到正式運作。

    • 展開RtlAllocateHeap的支援,修正了建立可執行記憶體集區時與RtlCreateHeapRtlAllocateHeap攔截器的相容性問題。

    • 已新增舊版 GlobalAllocLocalAlloc 記憶體函式系列的支援。 您可以藉由設定環境旗標 ASAN_OPTIONS=windows_hook_legacy_allocators=true來啟用這些攔截器。

    • 已更新陰影記憶體交錯和攔截失敗的錯誤訊息,以明確顯示問題與解決方案。

    • IDE 整合現在可以處理 ASan 所能回報的完整例外狀況集合。

    • 如果編譯程式和連結器偵測到您使用 ASan 建置,但不會發出偵錯資訊,則編譯程式和連結器會建議發出偵錯資訊。

  • 您現在可以使用新的 CL 參數 /openmp:llvm,以 OPENMP 執行時間的 LLVM 版本為目標。 這會在平行for迴圈中新增區段和未帶正負號索引變數的 #pragma omp 子句支援lastprivate。 此參數 /openmp:llvm 目前僅適用於 amd64 目標,但仍為實驗性。

  • Visual Studio CMake 項目現在具有遠端 Windows 開發的第一級支援。 這包括設定 CMake 專案以將 Windows ARM64 設為目標、將專案部署到遠端 Windows 電腦,以及從 Visual Studio 針對遠端 Windows 電腦上的專案進行偵錯。

  • 隨附於 Windows 版 Visual Studio 的 Ninja 版本已更新到 1.10 版。 如需包含專案的詳細資訊,請參閱 Ninja 1.10 版本資訊

  • 隨附於 Visual Studio 的 CMake 版本已經更新到 3.19 版。 如需包含專案的詳細資訊,請參閱 CMake 3.19 版本資訊

  • 將 STL 中的許多鎖定/防護類型標示為 nodiscard

  • IntelliSense:

    • 已改善 IntelliSense 中提供匯入的模組與標頭單元完成的穩定性與功能性。

    • 已針對模組匯入、對 export {...}的索引編製支援,以及具有相同名稱之模組的更精確的模組參考,新增 Go-to-definition。

    • 藉由新增對參考直接初始化中暫存的複製初始化支援,以及 __builtin_memmove修正和 consteval式之間的constexpr不一致、__builtin_memcpy常數表達式中的存留期延伸暫時,以及類似類型和參考系結,以改善 C++ IntelliSense 的語言一致性。

    • 已新增 make_unique、make_shared、emplace 與 emplace_back 的完成,其能以所指定的型別參數為基礎來提供完成。

  • MSVC 現在可判斷二進位檔所需的正確位址清理程式執行階段。 Visual Studio 專案會自動取得新的變更。 在命令行上使用位址清理程式時,您現在只需要傳遞 /fsanitize=address 至編譯程式。

  • Visual Studio 的連線管理員現在支援使用 ECDSA 公開金鑰演算法的私密金鑰。

  • 安裝程式隨附的 LLVM 與 Clang 版本已更新為 v11。 如需詳細資訊,請參閱 LLVMClang 的版本資訊。

  • Visual Studio 現在會使用工具鏈檔案中的 CMake 變數來設定 IntelliSense。 這會為內嵌式和 Android 開發提供更佳體驗。

  • 實作 More Constexpr Containers提案,可讓解構函式和新運算式成為 constexpr。 這為 和 std::string之類的constexprstd::vector公用程序鋪平了道路。

  • 針對 C++20 模組 IntelliSense 擴充支援,包括移至定義、移至模組及成員自動完成。

  • MSVC 編譯器現在支援縮寫的函式範本

Visual Studio 16.8 版中 C++ 的新功能

如需 Visual Studio 16.8 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.8 版的新功能。

  • C++20 協同程序現在支援於 /std:c++latest (或 /std:c++20 從 Visual Studio 2019 16.11 版開始)和 <coroutine> 標頭下。

  • IntelliSense 現在支援 C++20 <concepts><ranges> 標頭,且可重新命名與瀏覽概念定義。

  • STL 現在支援大部分的 C++20 範圍。

  • MSVC 現在支援 Conditionally trivial special member functions (有條件的 trivial 特殊成員函式)。

  • 和參數下/std:c11/std:c17現在支援 C11 和 C17。

  • 其他 STL 改善包括、 和 的完整支援std::atomic_refstd::midpoint,以及std::execution::unseq、 和的優化std::reverse_copy等等。std::lerp

  • 已將 Visual Studio 隨附的 CMake 版本升級為 CMake 3.18 \(英文\)。

  • 程式碼分析工具現在支援 SARIF 2.1 標準:靜態分析記錄格式的業界標準。

  • 現在,遺失 Linux 專案的建置工具會在工具列中發出警告,並在錯誤清單中清楚描述遺失的工具。

  • 您現在可偵錯遠端 Linux 系統上的 Linux 核心傾印,或直接從 Visual Studio 偵錯 WSL。

  • 針對 C++ Doxygen 批注產生,我們新增了其他批注樣式選項 (/*!//!)。

  • 其他 vcpkg 公告

  • 未評估內容中 Lambda 的編譯程序支援。

  • /DEBUG:FULL 透過建立多線程 PDB 來改善連結效能。 數個大型應用程式與 AAA 遊戲的連結速度會快 2 到 4 倍。

  • Visual Studio 除錯程式現在支援 char8_t

  • 支援使用 clang-cl 的 ARM64 專案。

  • Intel AMX 內建函式支援。

Visual Studio 16.7 版中 C++ 的新功能

如需 Visual Studio 16.7 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.7 版的新功能。

  • 遠端 C++ 支援現在支援更廣泛的 Linux distro 與 Shell,包括 sh、csh、bash、tsch、ksh、zsh 與 dash。 您可透過 ConnectionManager.exe 來修改新的 "shell" 屬性,以覆寫遠端連線的 shell 選擇。 這項支援已使用以遠端 Linux 系統或 WSL 為目標的 MSBuild 型 Linux 專案與 CMake 專案來進行測試。

  • 您現在可使用 Ninja (非常快速地評估累加建置的建置系統),以改善 MSBuild 型 Linux 專案的累加建置時間。 您可透過在 [一般] 屬性頁中,將 [啟用累加建置] 設定為 [使用 Ninja],以選擇使用這項功能。 Ninja (Ninja 式建置) 必須安裝在遠端 Linux 系統或 WSL 上。

  • 實作了新的 C++20 標準程式庫功能。 如需詳細清單,請參閱 GitHub 上的 STL 變更記錄

  • 您現可在連線管理員中編輯和設定預設的遠端 SSH 連線。 這表示您可以編輯現有的遠端連線(例如,如果IP位址已變更),並將默認連線設定為在CMake中取用 設定.json和launch.vs.json。 遠端 SSH 連線可讓您直接在 Visual Studio 中,建置及偵錯位於遠端 Linux 系統的 C++ 專案。

  • 在 Visual Studio 中增強了 Windows 上的 Clang (clang-cl) IntelliSense 支援。 Clang 的 include 路徑現在包含 clang 程式庫,我們改善了使用 std 程式庫時的編輯器內波浪線顯示,並且在 clang 模式中新增了 C++2a 的支援。

  • 您現在可以嘗試將程式碼錯誤加上底線,並在 C++ 專案中查看更多建議的快速修正。 在 [工具>選項>] 文字編輯器 > C/C++ > 實驗性下啟用此功能。 將 [停用實驗性程序代碼 Linter] 設定為 false。 前往 C++ 小組部落格深入了解。

  • 我們已新增四個新的程式碼分析規則,以將其他安全性功能納入 C++:C26817C26818C26819C26820

  • 我們已針對在具有 gdbserver 的遠端系統上對 CMake 專案進行偵錯新增第一級支援。

  • 在 Visual Studio 中使用適用於 C++ 之 AddressSanitizer 的實驗性實作 (現已可供 x64 原生專案使用),輕鬆地找出記憶體損毀錯誤。 我們現在也支援使用偵錯執行時間 (/MTd、 、 。 /MDd/LDd

  • IntelliSense 現已提供概念、指定初始設定式,以及其他數個 C++20 功能的基本支援。

  • .ixx.cppm 檔案現在會辨識為 C++,並透過語法醒目提示器和 IntelliSense 來處理。

Visual Studio 16.6 版中 C++ 的新功能

如需 Visual Studio 16.6 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.6 版的新功能。

  • 改善的 Doxygen/XML 批注產生: 輸入 ////** 更新版本函式,自動產生 Doxygen 或 XML 檔批註存根。 這些資訊現在也會顯示在快速諮詢工具提示中。

  • 適用於 Linux/WSL 的 CMake Ninja 支援: 在 WSL 或遠端系統上建置 CMake 專案時,請使用 Ninja 作為基礎產生器。 在新增 Linux 或 WSL 設定時,Ninja 現在是預設的產生器。

  • 遠端 CMake 偵錯的偵錯範本: 我們已在遠端 Linux 系統或使用 gdb 的 WSL 上簡化其 CMake 專案偵錯範本。

  • C++20 概念的初始支援: IntelliSense 現在可辨識 C++20 概念 ,並在成員清單中建議。

Visual Studio 16.5 版中 C++ 的新功能

如需 Visual Studio 16.5 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.5 版的新功能。

  • IntelliCode Team Completions 模型和成員變數支援: C++ 開發人員現在可以在自己的程式代碼基底上定型 IntelliCode 模型。 我們稱其為小組完成模型,因為您可以從您的小組做法中受益。 此外,我們還改善了成員變數的 IntelliCode 建議。

  • IntelliSense 改善:

    • IntelliSense 現在會在處理標準連結庫時顯示更容易閱讀的類型名稱。
    • 我們已新增切換 EnterSpaceTab 函式是否為認可字元的功能,以及切換 Tab 是否用來插入代碼段。 在 [工具>選項文字編輯器 > C/C++ > 進階 > IntelliSense] 底下>尋找這些設定。
  • 在命令行上 連線 管理員:您現在可以透過命令行與預存遠端連線互動。 這對於布建新開發計算機或設定 Visual Studio 持續整合等工作很有用。

  • 針對 WSL 進行偵錯和部署: 使用 Visual Studio 的 WSL 原生支援,將組建系統與遠端部署系統分開。 現在您可以在WSL上原生建置,並將組建成品部署到第二個遠端系統以進行偵錯。 CMake 專案和以 MSBuild 為基礎的 Linux 專案都支援此工作流程。

  • 支援 FIPS 140-2 合規性模式: 在開發以遠端 Linux 系統為目標的 C++ 應用程式時,Visual Studio 現在支援 FIPS 140-2 合規性模式。

  • CMake 語言檔案的語言服務,以及更好的 CMake 專案操作:

    • 以遠端 Linux 系統為目標的 CMake 專案原始程式檔複本已經過最佳化。 Visual Studio 現在會保留從遠端複製的最後一組來源「指紋檔案」,並根據已變更的檔案數目來最佳化行為。

    • CMake 文稿檔案中的函式、變數和目標現在支援程式代碼流覽功能,例如 [移至定義] 和 [尋找所有參考]。

    • 在 CMake 專案中,從 IDE 新增、移除和重新命名原始程式檔和目標,而不需要手動編輯您的 CMake 指令碼。 當使用 [方案總管] 新增或移除檔案時,Visual Studio 會自動編輯您的 CMake 專案。 您也可以從 [方案總管] 的 [目標] 檢視中新增、移除及重新命名專案的目標。

  • Linux 專案改善: Visual Studio Linux 專案現在擁有更精確的 IntelliSense,並可讓您逐個專案控制遠端標頭同步處理。

Visual Studio 16.4 版中 C++ 的新功能

如需 Visual Studio 16.4 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.4 版的新功能。

  • 無論您使用的是 Clang 或 MSVC 工具組,程式代碼分析現在都原生支援 Clang-Tidy MSBuild 和 CMake 專案。 clang-tidy 檢查可作為背景程式碼分析的一部分來執行、顯示為編輯器內的警告 (波浪線),以及顯示在錯誤清單中。

  • Visual Studio CMake 專案現在具有 [概觀] 頁面,可協助您開始進行跨平台開發。 這些頁面是動態的,可協助您連線至 Linux 系統,並將 Linux 或 WSL 組態新增至 CMake 專案。

  • CMake 專案的 [啟動] 下拉功能表現在會顯示您最近使用的目標,並可加以篩選。

  • C++/CLI 現在支援在 Windows 上搭配 .NET Core 3.1 或更新版本使用 interop。

  • 您現在能為 Windows 上以 MSVC 編譯的專案啟用 ASan,以進行 C++ 程式碼的執行階段檢測,其可協助偵測記憶體錯誤。

  • MSVC 的 C++ 標準程式庫更新:

    • C++17:實作 to_chars() 一般精確度,完成 P0067R5 基礎字串轉換 (charconv)。 這會完成 C++17 標準中所有程式庫功能的實作。
    • C++20:實作 P1754R1 將概念重新命名為 standard_case。 若要包含這些功能,請使用 /std:c++latest 編譯程式選項(或 /std:c++20 從Visual Studio 2019 16.11版開始)。 您也可以使用 C++ 語言標準屬性,在 [組態屬性 > C/C++ > 語言] 專案屬性頁中設定選項。
  • 現已提供名為 C++ Build Insights 的新工具集合。 如需公告的詳細資訊,請參閱 C++ 小組部落格

Visual Studio 16.3 版中 C++ 的新功能

如需 Visual Studio 16.3 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.3 版的新功能。

  • C++ 開發人員現在可以使用鍵盤快捷方式 Ctrl+KCtrl+/來切換行批注。

  • IntelliSense 成員列表現在會根據類型限定符進行篩選,例如, const std::vector 現在篩選出的方法,例如 push_back

  • 我們新增了這些 C++20 標準連結庫功能(可在 下 /std:c++latest取得,或 /std:c++20 從 Visual Studio 2019 16.11 版開始):

    • P0487R1:修正 operator>>(basic_istream&, CharT*)
    • P0616R0:在 <numeric> 中使用 move()
    • P0758R1 \(英文\):is_nothrow_convertible
    • P0734R0:C++ 概念的擴充功能
    • P0898R3:標準程式庫概念
    • P0919R3:未具順序之容器的異質查閱
  • 新的 C++ 核心指導方針檢查,包括新的「列舉規則」規則集,以及其他 constenum和類型規則。

  • 新的預設語義顏色標示配置可讓使用者更輕鬆地了解其程式碼;您可以設定呼叫堆疊視窗來隱藏範本引數,且 C++ IntelliCode 預設會開啟。

  • 在 launch.vs.json 和 tasks.vs.json 中的個別目標和工作上,使用 CMakeSettings.json 或 CppProperties.json 或是新的 "env" 標籤,來搭配環境變數設定偵錯目標和自訂工作。

  • 使用者現在可以對遺失的 vcpkg 套件使用快速動作,以自動開啟主控台並安裝至預設的 vcpkg 安裝。

  • 由 Linux 專案 (CMakeMSBuild) 完成的遠端標頭複製已最佳化,且現在會以平行方式執行。

  • Visual Studio 的 WSL 原生支援 \(英文\) 現在支援適用於 MSBuild 型 Linux 的平行建置。

  • 使用者現在可以指定要使用 Linux Makefile 專案部署至遠端系統的本機組建輸出清單。

  • CMake 設定編輯器 \(英文\) 中設定描述時,現在會包含更多內容和有用文件的連結。

  • IntelliCode 的 C++ 基底模型現在預設為啟用。 您可以前往 [工具]>[選項]>[IntelliCode] 來變更此設定。

Visual Studio 16.2 版的 C++ 新功能

如需 Visual Studio 16.2 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.2 版的新功能。

  • 對於設定了 Clang 的本機 CMake 專案,程式碼分析現在會執行 clang-tidy 檢查,並以編輯器內警告 (波浪線) 和錯誤清單中的一部分背景程式碼分析形式呈現。

  • 更新了 C++17 P0067R5 基礎字串轉換的 <charconv> 標頭:

    • 新增了 chars_format::fixedchars_format::scientific 有效位數的浮點數 to_chars() 多載 (chars_format::general precision 是唯一尚未實作的部分)
    • 最佳化 chars_format::fixed 最短
  • 已新增下列 C++20 標準連結庫功能:

    • /std:c++latest 可在 下提供 (或/std:c++20從 Visual Studio 2019 16.11 版開始):
      • P0020R6atomic<floating-point>
      • P0463R1:由小到大的列舉
      • P0482R6:適用於 UTF-8 字元與字串的 char8_t 類型
      • P0653R2:用於將指標轉換為原始指標的 to_address()
    • 可在 和 /std:c++latest/std:c++17取得 (或/std:c++20從 Visual Studio 2019 16.11 版開始):
      • P0600R1:程式庫中的[[nodiscard]]
    • 無條件提供:
      • P0754R2<version> 標頭
      • P0771R1std::function 移動建構函式應為 noexcept
  • Windows SDK 不再是 CMake for Windows 和 CMake for Linux 元件的相依性。

  • C++ 連結器的改善,可大幅改善最大輸入的反覆項目建置時間。 /DEBUG:FAST/INCREMENTAL 時間平均速度是速度的兩倍,現在 /DEBUG:FULL 快三到六倍。

Visual Studio 16.1 版中 C++ 的新功能

如需 Visual Studio 16.1 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.1 版的新功能。

C++ 編譯器

  • 這些 C++20 功能已在 C++ 編譯程式中實作,可在 下 /std:c++latest 取得(或 /std:c++20 從 Visual Studio 2019 16.11 版開始):

    • 為具有明確範本引數的函式呼叫運算式,增加透過依引數不同的查閱來尋找函式範本的功能 (P0846R0)。
    • 指定的初始化 (P0329R4),可讓特定成員在匯總初始化中選取,例如,使用 Type t { .member = expr } 語法。
  • Lambda 支援已經過全面檢修,解決了長久以來的大量問題。 使用 /std:c++20/std:c++latest時,預設會啟用這項變更。 在 /std:c++17 語言模式和預設 (/std:c++14 ) 模式下,可以使用 Visual Studio 2019 16.9 版或更新版本來啟用 /Zc:lambda 新的剖析器(先前可從 /experimental:newLambdaProcessor Visual Studio 2019 16.3 版開始使用),例如 /std:c++17 /Zc:lambda

C++ 標準程式庫改善

  • 這些 C++20 功能已新增至 C++ 標準連結庫的實作,可在 下 /std:c++latest取得:
    • 用於 basic_stringbasic_string_viewstarts_withends_with
    • 關聯容器的 contains
    • listforward_listremoveremove_ifunique 現在會傳回 size_type
    • shift_leftshift_right 已新增到 <algorithm>

C++ IDE

適用於 C++ 的 IntelliCode

IntelliCode 現在是以「使用 C++ 的桌面開發」 工作負載中的選擇性元件形式提供。 如需詳細資訊,請參閱改良了C++ IntelliCode 現在隨附於 Visual Studio 2019

IntelliCode 會使用自己的廣泛訓練和程式代碼內容,將您最有可能使用的內容放在完成清單頂端。 它通常不需要向下捲動清單。 針對 C++,當您使用標準程式庫之類的熱門程式庫時,IntelliCode 的幫助最大。

默認會停用新的 IntelliCode 功能(自定義模型、C++ 支援和 EditorConfig 推斷)。 若要啟用它們,請移至 [工具 > 選項 > ][IntelliCode > 一般]。 這個 IntelliCode 版本改善了正確性,並包含可用函式的支援。 如需詳細資訊,請參閱 AI-Assisted Code Completion Suggestions Come to C++ via IntelliCode (透過 IntelliCode 可實現 C++ 的 AI 輔助程式碼完成建議)。

快速諮詢改善

  • 快速諮詢工具提示現在會遵守您編輯器的語意色彩標示。 它也有新的 搜尋在線 連結,可搜尋在線檔,以取得暫留程式代碼建構的相關信息。 快速諮詢為紅色波浪線代碼提供的連結將會在在線搜尋錯誤。 如此一來,您就不需要將訊息重新輸入瀏覽器。 如需詳細資訊,請參閱 Visual Studio 2019 中的快速資訊改進:色彩標示和在線搜尋。

一般改善

  • 範本列可依據該範本在您程式碼基底中的具現化來填入下拉式功能表。

  • vcpkg 可以安裝之遺漏 #include 指示詞的燈泡,以及 CMake find_package 指示詞可用套件的自動完成。

  • 已修訂 C++ 專案的一般屬性頁。 某些選項現在會列在新的 [進階 ] 頁面底下。 [ 進階 ] 頁面也包含您慣用工具組架構、偵錯連結庫、MSVC 工具組次要版本和 Unity (jumbo) 組建的新屬性。

CMake 支援

  • 我們已將隨附於Visual Studio的 CMake 版本更新為3.14。 此版本新增了以 Visual Studio 2019 專案為目標的 MSBuild 產生器內建支援,以及檔案型的 IDE 整合 API。

  • 我們已新增 CMake 設定 編輯器的改善,包括支援現有快取中的 Windows 子系統 Linux 版 (WSL) 和組態、預設組建和安裝根目錄的變更,以及 Linux CMake 組態中環境變數的支援。

  • 內建 CMake 命令、變數和屬性的完成和快速資訊可讓您更輕鬆地編輯檔案 CMakeLists.txt

  • 我們已整合使用 Clang/LLVM 編輯、建置和偵錯 CMake 項目的支援。 如需詳細資訊,請參閱 Visual Studio 中的 Clang/LLVM 支援 \(英文\)。

Linux 和適用於 Linux 的 Windows 子系統

程式碼分析

遠端組建

  • 現在,在 MSBuild 和 CMake 專案中以 Linux 為目標時,使用者可將遠端組建電腦從遠端偵錯電腦分隔開來。

  • 遠端連線的改善記錄可讓您更輕鬆地診斷跨平臺開發中的問題。

Visual Studio 16.0 版 C++ 的新功能

如需 Visual Studio 16.0 版新功能和 Bug 修正的摘要,請參閱 Visual Studio 2019 16.0 版的新功能。

C++ 編譯器

  • 增強支援 C++17 功能與正確性修正,加上 C++20 功能 (例如模組和協同程式) 的實驗性支援。 如需詳細資訊,請參閱 Visual Studio 2019 中的 C++ 一致性改善

  • 此選項 /std:c++latest 現在包含不一定完成的 C++20 功能,包括 C++20 運算符 <=> (“spaceship”) 的初始支援,以進行三向比較。

  • C++ 編譯器參數 /Gm 現已被取代。 若已明確定義 /Gm 參數,請考慮將它從您的組建指令碼中停用。 或者,您也可以安全地忽略 /Gm 的過時警告,因為當使用 [將警告視為錯誤] (/WX) 時不會將它視為錯誤。

  • 隨著 MSVC 開始實作來自 C++20 標準版草稿的功能 (在 /std:c++latest 旗標下),/std:c++latest 現在與 /clr (所有版本)、/ZW/Gm 不相容。 在 Visual Studio 2019 中,當使用 /clr/ZW/Gm 編譯時,請使用 /std:c++17/std:c++14 模式 (但請參閱先前的項目符號內容)。

  • 根據預設,C++ 主控台和傳統型應用程式不再產生先行編譯標頭檔。

Codegen、安全性、診斷和版本控制

已改善分析 /Qspectre ,以提供Spectre Variant 1的風險降低協助(CVE-2017-5753)。 如需詳細資訊,請參閱 Spectre mitigations in MSVC (MSVC 中的 Spectre 風險降低)。

C++ 標準程式庫改善

  • 額外 C++17 與 C++20 程式庫功能與正確性修咒的實作。 如需詳細資訊,請參閱 Visual Studio 2019 中的 C++ 一致性改善

  • 我們已將 Clang 格式套用至 C++ 標準程式庫標頭,以改善可讀性。

  • 因為 Visual Studio 現在針對 C++ 支援 Just My Code,因此標準程式庫再也不需要為 std::functionstd::visit 提供自訂機器,就可以達到相同的效果。 大幅移除該機器對使用者沒有可見的影響。 其中一個例外狀況是,編譯程式將不再產生診斷,指出 或行15732480或 16707566 <type_traits><variant>的問題。

編譯器和標準程式庫在效能/輸送量方面的改進

  • 改善建置輸送量,包括連結器對檔案 I/O 的處理方式,以及合併與建立 PDB 類型的連結時間。

  • 新增了 OpenMP SIMD 向量化的基本支援。 您可以使用新的編譯器參數 /openmp:experimental 來啟用它。 此選項讓標註了 #pragma omp simd 的迴圈有機會向量化。 向量化並不保證會發生,而已標註但未向量化的迴圈會收到回報的警告。 不支援任何 SIMD 子句;系統會忽略這些子句並回報警告。

  • 新增了內嵌命令列參數 /Ob3,這是比 /Ob2 更為積極的版本。 /O2 (將二進位檔最佳化以提高速度) 仍預設表示 /Ob2。 若您發現編譯器的內嵌不夠積極,請考慮傳遞 /O2 -Ob3

  • 我們已新增簡短向量數學連結庫 (SVML) 內建函式的支援。 這些函式可計算 128 位元、256 位元或 512 位元的向量對等項目。 我們新增了它們來支援迴圈的手動向量化,並呼叫數學連結庫函式,以及某些其他作業,例如整數除法。 若要了解支援函式的定義,請參閱 Intel Intrinsic Guide

  • 新增及改進的最佳化:

    • 為使用 SIMD 向量內建函式的運算式提供常數摺疊和算數簡化,浮點數和整數形式均適用。

    • 有更強大的分析可從控制流程 (if/else/switch 陳述式) 擷取資訊,以移除總是證實為 true 或 false 的分支。

    • 改進了 memset 展開,以使用 SSE2 向量指令。

    • 改進了無用結構/類別複本的移除作業,尤其是依值傳遞的 C++ 程式。

    • 改進了使用 memmove 的程式碼最佳化,例如 std::copystd::vectorstd::string 建構。

  • 已將標準程式庫的實體設計最佳化,以避免編譯未直接包含標準程式庫的部分。 這項變更會縮短只 <vector> 包含一半之空白檔案的建置時間。 因此,您可能必須為先前間接包含的標頭加入 #include 指示詞。 例如,使用 std::out_of_range 的程式碼現在可能必須加入 #include <stdexcept>。 使用串流插入作業的程式碼現在可能必須加入 #include <ostream>。 優點是,只有實際使用 <stdexcept> 翻譯單位或 <ostream> 元件支付輸送量成本來編譯它們。

  • if constexpr 已套用到標準程式庫中的更多位置,以便在複製作業、反向與旋轉的排列組合,以及平行演算法程式庫中,提高輸送量並降低程式碼大小。

  • 標準程式庫現在會在內部使用 if constexpr 來減少編譯時間 (即使是在 C++14 模式中)。

  • 平行演算法程式庫的執行階段動態連結偵測已不再使用整個頁面來存放函式指標陣列。 將此記憶體標示為唯讀已被視為與安全性目的不再相關。

  • std::thread 構函式不會再等候線程啟動,也不會再插入基礎 C 連結庫 _beginthreadex 與所提供可呼叫對象之間的這麼多函式呼叫層。 std::thread先前在 和提供的可呼叫對象之間_beginthreadex放置六個函式。 這個數字已減少到只有三個,其中兩個只是 std::invoke。 這項變更也會解決模糊的計時錯誤,如果 std::thread 系統時鐘在建立的確切時刻 std::thread 變更,建構函式會停止回應。

  • 已修正 std::hash 中的效能迴歸,這是我們在實作 std::hash<std::filesystem::path> 時所引進的功能。

  • 標準程式庫現在會在數個地方使用解構函式來達到正確性,而非使用 Catch 區塊。 這項變更會產生更好的調試程序互動:您透過受影響位置的標準連結庫擲回的例外狀況現在會顯示為從其原始擲回網站擲回,而不是我們的重新擲回。 並非所有標準連結庫 catch 區塊都已消除。 我們預期 MSVC 的後續版本會減少 catch 區塊數目。

  • 因函式內部noexcept條件擲回所造成的次佳程式碼gen std::bitset 已藉由分解擲回路徑來修正。

  • std::liststd::unordered_* 系列在內部的許多位置使用非偵錯列舉程式。

  • 數個 std::list 成員已變更為儘可能重複使用清單節點,而非解除配置並重新配置它們。 例如,假設 list<int> 已經有 3 個大小,現在呼叫 會 assign(4, 1729) 覆寫 int 前三個清單節點中的值,並配置一個新的清單節點,其值為 1729。

  • erase(begin(), end()) 的所有標準程式庫呼叫都已變更為 clear()

  • std::vector n現在會在特定案例中以更有效率的方式初始化及擦除元素。

  • 改善 std::variant,讓它更適用於更最佳化工具,以產生更好的程式碼。 現在,內嵌程式碼搭配 std::visit 的效果更好。

C++ IDE

支援 Live Share C++

Live Share 現已支援 C++,可讓開發人員使用 Visual Studio 或 Visual Studio Code 即時共同作業。 如需詳細資訊,請參閱 宣佈適用於 C++ 的 Live Share:實時共用和共同作業

範本 IntelliSense

範本列現在使用瞄孔 Window UI 來取代強制回應視窗、支援巢狀範本,並會將任何預設引數預先填入瞄孔視窗中。 如需詳細資訊,請參閱 Template IntelliSense Improvements for Visual Studio 2019 Preview 2 (Visual Studio 2019 Preview 2 的範本 IntelliSense 改善)。 範本列中的 [最近使用] 下拉式清單,可讓您在前一組範例引數之間快速切換。

新的啟動視窗體驗

啟動 IDE 時,會出現新的 [開始] 視窗。 其有選項可開啟最近的專案、從原始檔控制複製程式代碼、開啟本機程式代碼作為方案或資料夾,或建立新的專案。 [新增專案] 對話方塊也大幅修改為易於搜尋的可篩選體驗。

部分專案範本的新名稱

我們已修改數個專案範本名稱與描述,以符合更新的 [新增專案] 對話方塊。

各種生產力改善功能

Visual Studio 2019 包含的下列功能可協助您更輕鬆且更直覺地撰寫程式碼:

  • 快速修正:
    • 新增遺漏 #include
    • NULL 移至 nullptr
    • 加入遺漏的分號
    • 解決遺漏命名空間或範圍的問題
    • 取代不正確的間接操作數 (*&&*
  • 將滑鼠游標停留在右括號,可顯示區塊的快速諮詢
  • 瞄孔標頭/程式碼檔
  • 移至 [定義] 開啟 #include 檔案

如需詳細資訊,請參閱 C++ Productivity Improvements in Visual Studio 2019 Preview 2 (Visual Studio 2019 Preview 2 中的 C++ 生產力改善功能)。

CMake 支援

  • CMake 3.14 的支援

  • Visual Studio 現在可以開啟外部工具所產生的現有 CMake 快取,例如 CMakeGUI、自訂的中繼組建系統,或可自動叫用 cmake.exe 的組建指令碼。

  • 改善的 IntelliSense 效能。

  • 新的設定編輯器可當成手動編輯 CMakeSettings.json 檔的替代方式,而且與 CMakeGUI 有部分同位。

  • Visual Studio 藉由偵測您的 Linux 電腦上是否有相容的 CMake 版本,協助您在 Linux 上使用 CMake 啟動 C++ 開發。 若沒有,則會為您安裝。

  • CMakeSettings 中不相容的設定 (例如不相符的架構或不相容的 CMake 產生器設定) 會在 JSON 編輯器中顯示波浪線,並在錯誤清單中顯示錯誤。

  • 只要執行了 vcpkg integrate install,就會為 IDE 中開啟的 CMake 專案自動偵測和啟用 vcpkg 工具鏈。 您可透過在 CMakeSettings 中指定空白的工具鏈檔案來關閉這個行為。

  • 根據預設,CMake 現在會啟用 Just My Code 偵錯。

  • 靜態分析警告現在會在背景處理,並顯示在 CMake 專案的編輯器中。

  • 為 CMake 專案新增了更清楚的建置及設定「開始」和「結束」訊息,及 Visual Studio 建置進度 UI 的支援。 此外,工具>選項現在有 CMake 詳細資訊設定,可在 [輸出] 視窗中自定義 CMake 建置和組態訊息的詳細層級。

  • CMakeSettings.json 中現在支援 cmakeToolchain 設定,不必手動修改 CMake 命令列就能指定工具鏈。

  • 新增 [全部建置] 功能表捷徑 Ctrl+Shift+B

IncrediBuild 整合

IncrediBuild 現在是以「使用 C++ 的桌面開發」 工作負載中的選擇性元件形式提供。 IncrediBuild 建置監視器已完全整合在 Visual Studio IDE 中。 如需詳細資訊,請參閱 使用 IncrediBuild 的組建監視器和 Visual Studio 2019 將組建可視化。

偵錯

  • 針對在 Windows 上執行的 C++ 應用程式,PDB 檔案現在會在個別的 64 位元處理序上載入。 這項變更可解決調試程式記憶體不足所造成的損毀範圍。 例如,偵錯包含大量模組和 PDB 檔案的應用程式時。

  • 搜尋已在 [監看式]、[自動變數] 與 [區域變數] 視窗中啟用。

使用 C++ 進行 Windows 桌面開發

  • 下列 C++ ATL/MFC 精靈已無法再使用:

    • ATL COM+ 1.0 元件精靈
    • ATL 動態伺服器網頁元件精靈
    • ATL OLE DB 提供者精靈
    • ATL 屬性頁精靈
    • ATL OLE DB 消費者精靈
    • MFC ODBC 消費者
    • 來自 ActiveX 控制項的 MFC 類別
    • 來自 Type Lib 的 MFC 類別。

    這些技術的範例程式代碼會封存於 Microsoft Learn 和 VCSamples GitHub 存放庫中。

  • Visual Studio 安裝程式中已不再提供 Windows 8.1 軟體開發工具包 (SDK)。 建議您將 C++ 項目升級至最新的 Windows SDK。 若您有 8.1 的強式相依性,可從 Windows SDK 封存加以下載。

  • 最新的 C++ 工具組無法再將 Windows XP 設為目標。 仍支援 VS 2017 級 MSVC 編譯器與程式庫的 XP 目標設定,並可透過「個別元件」安裝。

  • 我們的文件積極勸阻您對 Visual C++ 執行階段部署使用合併模組。 我們在這個版本更進一步淘汰了 MSM。 請考慮將您的 VCRuntime 集中部署從 MSM 移轉到可轉散發套件。

使用 C++ 進行行動裝置應用程式開發 (Android 與 iOS)

C++ Android 體驗現在預設為 Android SDK 25 與 Android NDK 16b。

Clang/C2 平台工具組

已移除 Clang/C2 實驗性元件。 針對具有 /permissive-/std:c++17 的完整 C++ 標準一致性使用 MSVC 工具集,或針對 Windows 使用 Clang/LLVM 工具鏈。

程式碼分析

單元測試

不再提供 Managed C++ 測試專案範本。 您可以繼續在現有的專案中使用受控 C++ 測試架構。 對於新的單元測試,請考慮使用 Visual Studio 有提供範本 (MSTest、Google Test) 或受控 C# 測試專案範本的其中一個原生測試架構。