次の方法で共有


Visual Studio 2019 での C++ の新機能

Visual Studio 2019 には、Microsoft C++ 環境に対する多くの更新プログラムと修正プログラムが導入されています。 コンパイラおよびツールの多くのバグと問題を修正しました。 多くの問題は、 [フィードバックの送信][問題の報告] および [提案の送信] オプションを通じてお客様から寄せられたものです。 バグ レポートをお寄せいただきありがとうございました。

Visual Studio 全体の新機能の詳細については、「Visual Studio 2019 の新機能」を参照してください。 Visual Studio 2017 での C++ の新機能については、「Visual Studio 2017 での C++ の新機能」を参照してください。 Visual Studio 2015 以前のバージョンでの C++ の新機能については、「Visual Studio 2003 から 2015 の Visual C++ の新機能」を参照してください。 詳細については、「Microsoft C++ ドキュメント: 新機能」を参照してください。

Visual Studio バージョン 16.11 での C++ の新機能

Visual Studio バージョン 16.11 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.11 の新機能に関する記事を参照してください。

  • コンパイラで、/std:c++20 コンパイラ モードがサポートされるようになりました。 以前は、C++20 の機能は、Visual Studio 2019 の /std:c++latest モードでのみ利用できました。 もともと /std:c++latest モードを必要としていた機能は、最新バージョンの Visual Studio では、 /std:c++20 モード以降で動作するようになりました。

  • Visual Studio に付属している LLVM ツールが LLVM 12 にアップグレードされました。 詳細については、LLVM のリリース ノートを参照してください。

  • Clang-cl のサポートが LLVM 12 に更新されました。

Visual Studio バージョン 16.10 での C++ の新機能

Visual Studio バージョン 16.10 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.10 の新機能に関する記事を参照してください。

  • C++20 のすべての機能が、/std:c++latest で使用できるようになりました。 MSVC の C++20 標準 (現在は ISO によって発行されている) の実装は機能が完全ですが、いくつかの重要な C++20 ライブラリ機能は、後の欠陥レポート (ISO C++20 バグ修正) によって修正されることが予想されます。これらは ABI と互換性のない方法で変更される可能性があります。 詳細については、Microsoft/STL のイシュー #1814 を参照してください。

    • C++20 の即時関数と constinit のサポートが、16.10 で追加されました
    • <chrono> の最後の部分: 新しいクロック、うるう秒、タイム ゾーン、解析
    • テキストの書式設定に対する <format> の実装
  • /openmp:llvm が、x64 に加えて、x86 と ARM64 でも使用できるようになりました。

  • カスタマイズされたコンパイル警告レベルとコード分析設定により、インクルード ディレクトリを外部として指定できるようになりました。

  • 以前の言語モードに C++20 スタイルのコルーチンを有効にする /await:strict オプションを追加しました。

  • デバッガーで std::coroutine_handle<T> が視覚化され、元のコルーチン関数の名前とシグネチャ、および現在の中断ポイントが表示されるようになりました。

  • CMakePresets のサポートを追加しました。

  • Visual Studio で新しいリモート接続を追加するときに、サーバーによって提示されるホスト キーのフィンガープリントを受け入れるか拒否するかが求められるようになりました。

  • 警告の目的で外部として扱われる必要があるヘッダーを指定するために、MSVC に /external スイッチを追加しました。

Visual Studio バージョン 16.9 での C++ の新機能

Visual Studio バージョン 16.9 での新機能とバグ修正の概要については、「Visual Studio 2019 バージョン 16.9 の新機能」を参照してください。

  • Address Sanitizer:

    • Windows での Address Sanitizer のサポートが試験段階ではなくなり、一般提供が開始されました。

    • RtlAllocateHeap のサポートが拡張され、実行可能なメモリ プールを作成する際の RtlCreateHeap および RtlAllocateHeap インターセプターに関する互換性の問題が修正されました。

    • 従来の GlobalAlloc および LocalAlloc ファミリのメモリ関数に対するサポートが追加されました。 これらのインターセプターは、環境フラグ ASAN_OPTIONS=windows_hook_legacy_allocators=true を設定することによって有効にすることができます。

    • シャドウ メモリ インターリーブおよびインターセプト エラーに関するエラー メッセージが更新され、問題と解決策が明確になりました。

    • IDE の統合により、ASan で報告できる例外の完全なコレクションを処理できるようになりました。

    • コンパイラとリンカーにより、ASan を使用してビルドしているがデバッグ情報を出力していないことが検出された場合に、デバッグ情報を出力することが提案されます。

  • 新しい CL スイッチ /openmp:llvm を使用して、LLVM バージョンの OpenMP ランタイムをターゲットにすることができるようになりました。 これにより、#pragma omp セクションでの lastprivate 句と、並列 for ループでの符号なしインデックス変数に対するサポートが追加されます。 現在、 /openmp:llvm スイッチは amd64 ターゲットでのみ使用可能であり、まだ試験段階です。

  • Visual Studio CMake プロジェクトで、リモート Windows 開発が高度にサポートされるようになりました。 これには、Windows ARM64 をターゲットとする CMake プロジェクトの構成、リモート Windows コンピューターへのプロジェクトの配置、および Visual Studio からのリモート Windows コンピューター上でのプロジェクトのデバッグが含まれます。

  • Windows の Visual Studio に付属する Ninja のバージョンは、バージョン 1.10 に更新されました。 含まれる内容の詳細については、Ninja 1.10 のリリース ノートを参照してください。

  • Visual Studio に付属する CMake のバージョンは、バージョン 3.19 に更新されました。 含まれる内容の詳細については、「CMake 3.19 のリリース ノート」を参照してください。

  • STL の多くの lock/guard 型が nodiscard としてマークされました

  • IntelliSense:

  • MSVC で、お使いのバイナリに必要な正しい Address Sanitizer ランタイムが判断できるようになりました。 この新しい変更は、お使いの Visual Studio プロジェクトで自動的に取得されます。 コマンド ラインで Address Sanitizer を使用する場合は、コンパイラに /fsanitize=address のみを渡せばよくなりました。

  • Visual Studio の接続マネージャーで、ECDSA 公開キー アルゴリズムを使用する秘密キーがサポートされるようになりました。

  • インストーラーに付属している LLVM と Clang のバージョンが v11 に更新されました。 詳細については、LLVMClang のリリース ノートを参照してください。

  • Visual Studio で IntelliSense の構成に、ツールチェーン ファイルの CMake 変数が使用されるようになりました。 これにより、Embedded および Android 開発のエクスペリエンスが向上します。

  • より多くの constexpr コンテナー提案を実装することで、デストラクターと新しい式を constexpr にすることができます。 これにより、constexpr std::vectorstd::string などのユーティリティへの道が開かれます。

  • C++20 モジュール IntelliSense の延長サポート ([定義に移動]、[モジュールに移動]、[member completion](メンバー完了) など)。

  • 省略形の関数テンプレートが MSVC コンパイラーでサポートされるようになりました。

Visual Studio バージョン 16.8 での C++ の新機能

Visual Studio バージョン 16.8 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.8 の新機能に関する記事を参照してください。

  • C++ 20 コルーチンが /std:c++latest (または Visual Studio 2019 バージョン 16.11 以降は /std:c++20 ) と <coroutine> ヘッダーでサポートされるようになりました。

  • IntelliSense で、C++ 20 の <concepts><ranges> ヘッダー、および概念の定義の名前変更と参照がサポートされるようになりました。

  • STL で、C++20 Ranges の多くがサポートされるようになりました。

  • 条件付きで自明な特殊メンバー関数が MSVC でサポートされるようになりました。

  • C11 と C17 が /std:c11 および /std:c17 スイッチでサポートされるようになりました。

  • 追加された STL の機能強化には、std::atomic_refstd::midpointstd::lerp、および std::execution::unseq の完全なサポートや、std::reverse_copy の最適化などが含まれます。

  • Visual Studio に付属している CMake のバージョンを CMake 3.18 にアップグレードしました。

  • コード分析ツールで、業界標準の静的な分析ログ形式である SARIF 2.1 標準がサポートされるようになりました。

  • Linux プロジェクトで見つからないビルド ツールがある場合、ツール バーには警告が表示され、エラー一覧には不足しているツールが明記されるようになりました。

  • Linux コア ダンプを、リモートの Linux システムまたは WSL の Visual Studio から直接デバッグできるようになりました。

  • C++ Doxygen でのコメントの生成用に、新しいコメント スタイル オプションが追加されました (/*!//!)。

  • 追加の vcpkg の発表

  • 未評価のコンテキストでのラムダのコンパイラ サポート。

  • マルチスレッドでの PDB の作成により、/DEBUG:FULL リンクのパフォーマンスが向上しました。 いくつかの大規模なアプリケーションと AAA ゲームでは、リンクの速度が 2 から 4 倍高速になっています。

  • Visual Studio デバッガーで char8_t がサポートされるようになりました。

  • clang-cl を使用した ARM64 プロジェクトのサポート。

  • Intel AMX 組み込みサポート。

Visual Studio バージョン 16.7 での C++ の新機能

Visual Studio バージョン 16.7 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.7 の新機能に関する記事を参照してください。

  • Microsoft はリモート C++ について、sh、csh、bash、tsch、ksh、zsh、dash など、幅広い Linux のディストリビューションとシェルをサポートするようになりました。 ConnectionManager.exe を利用して新しい "shell" プロパティを変更することでリモート接続のシェル選択をオーバーライドできます。 このサポートは、リモート Linux システムまたは WSL をターゲットにする MSBuild ベースの Linux プロジェクトと CMake プロジェクトの両方でテストされています。

  • Ninja (インクリメンタル ビルドを非常に短時間で評価するビルド システム) を使用し、MSBuild ベースの Linux プロジェクトのインクリメンタル ビルド時間を改善できるようになりました。 [全般プロパティ] ページで [インクリメンタル ビルドを有効にする] を [With Ninja](Ninja を使用する) に設定することでこの機能を選択できます。 Ninja (ninja-build) はリモートの Linux システムまたは WSL にインストールする必要があります。

  • 新しい C++20 標準ライブラリ機能が実装されました。 詳細な一覧については、GitHub の STL Changelog を参照してください。

  • 接続マネージャーで、既定のリモート SSH 接続を編集および設定できるようになりました。 つまり、既存のリモート接続を編集したり (IP アドレスが変更された場合など)、既定の接続を CMakeSettings.json や launch.vs.json 内で使用されるように設定したりすることができます。 リモート SSH 接続を使用すると、リモートの Linux システム上でのプロジェクトのビルドおよびデバッグを、Visual Studio から直接行うことができます。

  • Visual Studio で、Windows 上の Clang (clang-cl) に対する IntelliSense サポートが強化されました。 clang インクルード パスに clang ライブラリが含まれるようになりました。std ライブラリを使用する際のエディター内の波線表示を改善しました。clang モードに C++2a のサポートを追加しました。

  • C++ プロジェクトで、コード エラーに下線を引いてみると、提案されるより多くのクイック修正を参照できるようになりました。 [ツール] > [オプション] > [テキスト エディター] > [C/C++] > [試験的] でこの機能を有効にします。 [実験的なコード リンターの無効化] を false に設定します。 詳細については、C++ チーム ブログを参照してください。

  • 追加の安全機能を C++ に組み込むための新しいコード分析規則を 4 つ追加しました: 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 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.6 の新機能に関する記事を参照してください。

  • Doxygen または XML のコメント生成の強化: 関数の上に /// または /** を入力することで、Doxygen または XML ドキュメント コメントのスタブを自動的に生成します。 クイック ツール ヒントにも表示されるようになりました。

  • Linux または WSL 用 CMake での Ninja のサポート: WSL またはリモート システム上で CMake プロジェクトをビルドする場合に、基になるジェネレーターとして Ninja を使用します。 Ninja は、Linux または WSL の新しい構成を追加するときの既定のジェネレーターになりました。

  • リモート CMake デバッグ用のデバッグ テンプレート: リモートの Linux システムまたは WSL 上で gdb を使用して CMake プロジェクトをデバッグするためのテンプレートが簡略化されました。

  • C++20 の概念の初期サポート: IntelliSense で C++20 の概念を認識し、メンバー リストでこれを提示するようになりました。

Visual Studio バージョン 16.5 での C++ の新機能

Visual Studio バージョン 16.5 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.5 の新機能に関する記事を参照してください。

  • IntelliCode のチーム入力候補モデルとメンバー変数のサポート: C++ 開発者が、独自のコードベースで IntelliCode モデルをトレーニングできるようになりました。 チームの作業から恩恵を受けられるため、これはチームの入力候補モデルと呼ばれます。 さらに、メンバー変数の IntelliCode の提案を改善しました。

  • IntelliSense の機能強化:

    • 標準ライブラリを処理するときに、IntelliSense でよりわかりやすい型名が表示されるようになりました。
    • EnterSpaceTab 機能による文字のコミット、スニペットの挿入に Tab を使用するかどうかの切り替えが可能になりました。 これらの設定は、[ツール] > [オプション] > [テキスト エディター] > [C/C++] > [詳細設定] > [IntelliSense] にあります。
  • コマンド ラインを介した接続マネージャー: コマンド ラインを使用して、保存されているリモート接続を操作できるようになりました。 これは、新しい開発用マシンのプロビジョニングや、継続的インテグレーションでの Visual Studio の設定のようなタスクに役立ちます。

  • WSL のデバッグと配置: Visual Studio の WSL のネイティブ サポートを使用して、リモート配置システムからビルド システムを分離します。 WSL 上でネイティブにビルドし、デバッグ用に 2 つ目のリモート システムにビルド成果物を配置できるようになりました。 このワークフローは、CMake プロジェクトと MSBuild ベースの Linux プロジェクトの両方でサポートされています。

  • FIPS 140-2 準拠モードのサポート: Visual Studio で、リモート Linux システムをターゲットとする C++ アプリケーションを開発するときに、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 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.4 の新機能に関する記事を参照してください。

  • Code Analysis では、Clang と MSVC ツールセットのどちらを使用しているかにかかわらず、MSBuild と CMake の両方のプロジェクトで Clang-Tidy がネイティブにサポートされるようになりました。 clang-tidy チェックは、バックグラウンド コード分析の一部として実行し、エディター内警告 (波線) として示し、エラー一覧に表示できます。

  • クロスプラットフォームの開発を開始するのに役立つ概要ページが Visual Studio CMake プロジェクトに追加されました。 これらのページを使用すると、Linux システムに接続し、ご利用の CMake プロジェクトに Linux または WSL 構成を追加するのが楽になります。

  • CMake プロジェクト用の起動ドロップダウン メニューに、最近使用したターゲットが表示され、フィルター処理できるようになりました。

  • C++/CLI では、Windows 用の .NET Core 3.1 以降との相互運用がサポートされるようになりました。

  • メモリ エラーの検出に役立つ C++ コードのランタイム インスツルメンテーションのために、Windows 上の MSVC でコンパイルされたプロジェクトに対して ASan を有効にできるようになりました。

  • MSVC の C++ 標準ライブラリに対する更新:

    • C++17:to_chars() の一般的精度が実装され、P0067R5 の基本文字列変換 (charconv) が完了しました。 これにより、C++17 標準のすべてのライブラリ機能の実装が完了します。
    • C++20:P1754R1 の名前変更概念が standard_case に実装されました。 これらの機能を含めるには、 /std:c++latest コンパイラ オプション (または Visual Studio 2019 バージョン 16.11 以降は /std:c++20 ) を使用します。 このオプションは、C++ 言語の標準プロパティを使用して、[構成プロパティ] > [C/C++] > [言語] プロジェクトのプロパティ ページで設定することもできます。
  • C++ Build Insights という名前の新しいツールのコレクションを使用できるようになりました。 この発表の詳細については、C++ チーム ブログを参照してください。

Visual Studio バージョン 16.3 での C++ の新機能

Visual Studio バージョン 16.3 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.3 の新機能に関する記事を参照してください。

  • C++ 開発者は、キーボード ショートカット Ctrl + KCtrl + / キーを使用して行コメントを切り替えることができるようになりました。

  • IntelliSense メンバー リストが型修飾子に基づいてフィルター処理されるようになりました。たとえば、const std::vector では push_back などのメソッドが除外されます。

  • これらの C++20 標準ライブラリの機能を追加しました (Visual Studio 2019 バージョン 16.11 以降で /std:c++latest または /std:c++20 で使用可能)。

    • P0487R1:operator>>(basic_istream&, CharT*) の修正
    • P0616R0:<numeric> での move() の使用
    • P0758R1: is_nothrow_convertible
    • P0734R0:概念の C++ 拡張機能
    • P0898R3:標準ライブラリの概念
    • P0919R3:順序なしコンテナーの異種ルックアップ
  • 新しい "列挙型規則" 規則セット、追加の constenum、および型の規則を含む、新しい C++ Core Guideline チェック

  • 新しい既定のセマンティック色付けスキームでは、ユーザーはコードをひとめでより理解しやすくなります。呼び出し履歴ウィンドウはテンプレート引数を非表示にするように構成でき、C++ IntelliCode は既定でオンになります。

  • launch.vs.json および tasks.vs.json の個々のターゲットとタスクで CMakeSettings.json か CppProperties.json か新しい "env" タグを使用して、環境変数を使いデバッグ ターゲットとカスタム タスクを構成します。

  • ユーザーは、不足している vcpkg パッケージに対するクイック アクションを使用して、自動的にコンソールを開き、既定の vcpkg インストールにインストールできるようになりました。

  • Linux プロジェクト (CMake および MSBuild) によって行われるリモート ヘッダー コピーが最適化され、並列で実行されるようになりました。

  • Visual Studio の WSL 用ネイティブ サポートにより、MSBuild ベースの Linux プロジェクトの並列ビルドがサポートされるようになりました。

  • ユーザーは、Linux メイクファイル プロジェクトを使用してリモート システムに配置するローカル ビルド出力の一覧を指定できるようになりました。

  • CMake 設定エディターの設定の説明に、さらに詳しいコンテキストと役立つドキュメントへのリンクが含まれるようになりました。

  • IntelliCode の C++ 基本モデルが既定で有効になりました。 この設定を変更するには、 [ツール]>[オプション]>[IntelliCode] の順に移動します。

Visual Studio バージョン 16.2 での C++ の新機能

Visual Studio バージョン 16.2 での新機能とバグ修正の概要については、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 (または Visual Studio 2019 バージョン 16.11 以降は /std:c++20) で使用可能:
      • P0020R6: atomic<floating-point>
      • P0463R1: エンディアン列挙型
      • P0482R6: UTF-8 文字と文字列用の char8_t
      • P0653R2: ポインターを生ポインターに変換するための to_address()
    • /std:c++17/std:c++latest (または Visual Studio 2019 バージョン 16.11 以降は /std:c++20) で使用可能:
      • P0600R1: ライブラリの [[nodiscard]]
    • 無条件で使用可能:
      • P0754R2: <version> ヘッダー
      • P0771R1: std::function の移動は noexcept にする必要があります
  • Windows SDK は、Windows 用 CMake および Linux 用 CMake のコンポーネントと依存しなくなりました。

  • C++ リンカーの機能強化により、繰り返しビルド時間の入力の大部分が大幅に改善しました。 /DEBUG:FAST/INCREMENTAL の時間は平均で 2 倍高速になり、 /DEBUG:FULL は現在 3 から 6 倍高速になりました。

Visual Studio バージョン 16.1 での C++ の新機能

Visual Studio バージョン 16.1 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.1 の新機能に関する記事を参照してください。

C++ コンパイラ

  • これらの C++20 の機能は C++ コンパイラに実装されており、 /std:c++latest (または Visual Studio 2019 バージョン 16.11 以降は /std:c++20 ) で使用できます。

    • 明示的なテンプレート引数を含む関数呼び出し式の引数依存照合を使用する、関数テンプレートの検索機能が強化されました (P0846R0)。
    • 初期化が指定されました (P0329R4)。これにより、集約の初期化で特定のメンバーを選択できるようになります (たとえば、Type t { .member = expr } 構文を使用します)。
  • ラムダ サポートが見直され、長期にわたる多くのバグに対処できるようになりました。 /std:c++20 または /std:c++latest の使用時に、既定でこの変更が有効になります。 Visual Studio 2019 バージョン 16.9 以降の場合、 /std:c++17 言語モードと既定の ( /std:c++14 ) モードでは、/Zc:lambda を使用することで新しいパーサーを有効にできます (以前は、Visual Studio 2019 バージョン 16.3 以降で /experimental:newLambdaProcessor として入手できました)。たとえば、/std:c++17 /Zc:lambda です。

C++ 標準ライブラリの機能強化

  • C++ 標準ライブラリの実装に、次の C++20 機能が追加されました。これらは /std:c++latest で使用できます。
    • basic_stringbasic_string_view 向けの starts_withends_with
    • 連想コンテナーの contains
    • listforward_listremoveremove_if、および uniquesize_type が返されるようになりました。
    • shift_left および shift_right<algorithm> に追加されました。

C++ IDE

C++ 向けの IntelliCode

IntelliCode がオプションのコンポーネントとしてC++ によるデスクトップ開発ワークロードに付属するようになりました。 詳細については、Visual Studio 2019 に付属する強化された C++ IntelliCode に関するページをご覧ください。

IntelliCode では、独自の広範なトレーニングとコード コンテキストを使用して、使用される可能性が最も高いものが入力候補一覧の一番上に配置されます。 多くの場合、一覧を見るとき下にスクロールする必要がなくなります。 C++ の場合、標準ライブラリのような一般的なライブラリを使用しているときには、IntelliCode からほとんどのヘルプが提供されます。

新しい IntelliCode 機能 (カスタム モデル、C++ サポート、および EditorConfig 推論) は既定で無効になっています。 それらを有効にするには、[ツール] > [オプション] > [IntelliCode] > [全般] にアクセスします。 このバージョンの IntelliCode では精度が向上し、free 関数のサポートが含まれています。 詳細については、「AI-Assisted Code Completion Suggestions Come to C++ via IntelliCode」 (AI によるコード入力支援機能が IntelliCode 経由で C++ でも利用可能に) を参照してください。

クイック ヒントの機能強化

全般的な機能強化

  • テンプレート バーでは、コードベース内での該当のテンプレートのインスタンス化に基づいて、ドロップダウン メニューを入力できます。

  • vcpkg でインストール可能な足りない #include ディレクティブを示す電球、および CMake find_package ディレクティブの利用可能なパッケージのオートコンプリート。

  • C++ プロジェクトの [全般] プロパティ ページが変更されました。 一部のオプションが、新しい [詳細設定] ページに一覧表示されるようになりました。 [詳細設定] ページには、優先するツールセット アーキテクチャ、デバッグ ライブラリ、MSVC ツールセットのマイナー バージョン、および Unity (jumbo) ビルド用の新しいプロパティも含まれています。

CMake サポート

  • Visual Studio に付属する CMake バージョンが 3.14 に更新されました。 このバージョンでは、ファイルベースの IDE 統合 API だけでなく、Visual Studio 2019 プロジェクトをターゲットとする MSBuild ジェネレーターの組み込みサポートが追加されています。

  • CMake 設定エディターに対する機能強化が追加されました。これには、既存のキャッシュからの Linux 用 Windows サブシステム (WSL) および構成のサポート、既定のビルドおよびインストール ルートの変更、Linux CMake 構成での環境変数のサポートが含まれます。

  • 組み込みの CMake コマンド、変数、およびプロパティの入力候補とクイック ヒントにより、 CMakeLists.txt ファイルの編集が簡単になりました。

  • Clang/LLVM を使った CMake プロジェクトの編集、ビルド、デバッグのサポートが統合されました。 詳細については、「Clang/LLVM Support in Visual Studio (Visual Studio での Clang/LLVM のサポート)」をご覧ください。

Linux と Windows Subsystem for Linux

コード分析

リモート ビルド

  • MSBuild および CMake プロジェクトの両方において、Linux をターゲットとする場合に、リモート ビルド マシンをリモート デバッグ マシンから分離できるようになりました。

  • リモート接続のログ記録が強化されたことで、クロスプラットフォーム開発における問題が診断しやすくなります。

Visual Studio バージョン 16.0 での C++ の新機能

Visual Studio バージョン 16.0 での新機能とバグ修正の概要については、Visual Studio 2019 バージョン 16.0 の新機能に関する記事を参照してください。

C++ コンパイラ

  • C++17 機能と正確性の修正に関するサポート強化に加え、モジュールやコルーチンなど、C++20 機能の実験的サポート。 詳しくは、「C++ Conformance Improvements in Visual Studio 2019」(Visual Studio 2019 での C++ 準拠の強化) をご覧ください。

  • /std:c++latest オプションには現在、3 方向比較のための C++20 演算子 <=> ("宇宙船") の初期サポートなど、必ずしも完全ではない C++20 機能が含まれています。

  • C++ コンパイラ スイッチ /Gm は現在、非推奨になっています。 ご自分のビルド スクリプト内の /Gm スイッチが明示的に定義されている場合は、それを無効にすることを検討してください。 ただし、"警告をエラーとして扱う" (/WX) を使用しているとき、/Gm の非推奨化に関する警告はエラーとして扱われないので無視してもかまいません。

  • MSVC により、/std:c++latest フラグの下で C++20 標準ドラフトの機能の実装が開始されたため、/std:c++latest/clr (すべてのフレーバー)、/ZW/Gm との互換性がなくなりました。 Visual Studio 2019 では、/clr/ZW、または /Gm を使ってコンパイルする場合は /std:c++17 または /std:c++14 モードを使ってください (ただし、前の項目を確認してください)。

  • C++ コンソール アプリとデスクトップ アプリに対して、プリコンパイル済みヘッダーが既定では生成されなくなりました。

コード生成、セキュリティ、診断、バージョン管理

Spectre Variant 1 の軽減策サポートを提供するため、/Qspectre を使用した分析が強化されました (CVE-2017-5753)。 詳細については、「Spectre Mitigations in MSVC」 (MSVC の Spectre 軽減策) を参照してください。

C++ 標準ライブラリの機能強化

  • 追加の C++17 と C++20 のライブラリ機能と正確性の修正の実装。 詳しくは、「C++ Conformance Improvements in Visual Studio 2019」(Visual Studio 2019 での C++ 準拠の強化) をご覧ください。

  • Clang-Format が C++ 標準ライブラリのヘッダーに適用され、読みやすさが向上しました。

  • Visual Studio で C++ の [マイ コードのみ] がサポートされるようになったため、同じ効果を実現するため標準ライブラリで std::functionstd::visit のカスタム メカニズムを提供する必要がなくなりました。 そのメカニズムが削除されても、ユーザーが確認できる影響はほとんどありません。 ただし、コンパイラにより、<type_traits> または <variant> の行 15732480 または 16707566 上の問題を示す診断が生成されなくなります。

コンパイラと標準ライブラリでのパフォーマンス/スループットの向上

  • リンカーによるファイル I/O の処理や PDB タイプのマージと作成のリンク時間など、ビルドのスループットが改善されました。

  • OpenMP SIMD ベクター化の基本的なサポートが追加されました。 これは新しいコンパイラ スイッチ /openmp:experimental を使用して有効にできます。 このオプションにより、#pragma omp simd で注釈が付けられたループをベクター化できる可能性があります。 ベクター化は保証されておらず、注釈が付けられていてもベクター化されていないループに対しては警告が報告されます。 SIMD 句はサポートされていません。無視され、警告が報告されます。

  • 新しいインライン展開コマンド ライン スイッチ /Ob3 が追加されました。これは、/Ob2 より積極的なバージョンです。 /O2 (速さのためにバイナリを最適化) は引き続き、既定で /Ob2 を意味します。 コンパイラのインライン展開が十分に積極的でない場合、/O2 -Ob3 を渡すことを検討してください。

  • Short Vector Math Library (SVML) 組み込み関数のサポートが追加されました。 これらの関数では、128 ビット、256 ビット、または 512 ビットの同等のベクターが計算されます。 これらが追加されたことで、数値演算ライブラリ関数および整数除算などの他の特定の演算の呼び出しを含むループの手動ベクター化がサポートされました。 サポートされている関数の定義については、Intel 組み込みガイドをご覧ください。

  • 新規および改良された最適化:

    • float と integer の両方の形式に対する、SIMD ベクター組み込み関数を使用する式の定数折りたたみと計算の簡略化。

    • 常に true または false になることがわかっている分岐を削除するために制御フロー (if/else/switch ステートメント) から情報を抽出するためのいっそう強力な分析。

    • SSE2 ベクター命令を使用するための memset アンローリングの向上。

    • 意味のない構造体/クラスのコピーの削除の向上、特に値渡しの C++ プログラムの場合。

    • std::copy または std::vector および std::string 構築など、memmove を利用したコードの最適化の改善。

  • 標準ライブラリで直接インクルードされない部分のコンパイルを回避するよう、標準ライブラリの物理的設計を最適化しました。 この変更により、<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 と指定された呼び出し可能オブジェクトの間に 6 つの関数が配置されていました。 この数は 3 つのみに減りました。そのうちの 2 つは単に std::invoke です。 また、この変更により、std::thread の作成とちょうど同じ時間にシステム クロックが変更された場合に std::thread のコンストラクターが応答を停止するという、あいまいなタイミングのバグも解決されます。

  • std::hash<std::filesystem::path> を実装する際に導入された std::hash のパフォーマンス低下を修正しました。

  • 標準ライブラリのいくつかの場所で、正確性を実現するために catch ブロックの代わりにデストラクターが使われるようになりました。 この結果、デバッガーの操作性が向上します。標準ライブラリの影響を受けた場所を通じてスローした例外は、再スローではなく、その元のスロー サイトからスローされたものとして表示されるようになります。 すべての標準ライブラリ キャッチ ブロックが削除されたわけではありません。 MSVC の今後のリリースでは、catch ブロック数が減ると予想されます。

  • noexcept 関数内の条件付きスローが原因となる std::bitset の準最適な codegen が、スローのパスを取り除くことで修正されました。

  • std::list および std::unordered_* ファミリで、より多くの場所で内部的に非デバッグの反復子が使われます。

  • std::list のいくつかのメンバーが変更され、リスト ノードを開放して再割り当てする代わりに、可能であればそれらを再利用するようになりました。 たとえば、既にサイズ 3 の list<int> があるとします。assign(4, 1729) を呼び出すと、最初の 3 つのリスト ノードの int 値が上書きされ、1 つの新しいリスト ノードが値 1729 と共に割り当てられるようになりました。

  • 標準ライブラリのすべての erase(begin(), end()) 呼び出しが clear() に変更されました。

  • std::vector で、特定のケースでより効率的に要素を初期化および消去できるようになりました。

  • std::variant が改善され、最適化がより簡単になりました。結果的に、より良いコードが生成されます。 std::visit を利用することで、コードのインライン展開が改善されます。

C++ IDE

Live Share C++ サポート

Live Share は C++ 対応になりました。Visual Studio または Visual Studio Code を使用する開発者はリアルタイムで共同作業できます。 詳細については、「Announcing Live Share for C++: Real-Time Sharing and Collaboration」 (C++ 向け Live Share のお知らせ: リアルタイムの共有と共同作業) を参照してください

テンプレート IntelliSense

テンプレート バーで、モーダル ウィンドウではなくピーク ウィンドウ UI が使用され、入れ子になったテンプレートがサポートされ、ピーク ウィンドウに既定の引数が設定されるようになりました。 詳細については、「Template IntelliSense Improvements for Visual Studio 2019 Preview 2」 (Visual Studio 2019 プレビュー 2 のテンプレート IntelliSense 改善) を参照してください。 テンプレート バー[直前に使用] ドロップダウンでは、前に使用したサンプル引数のセットを簡単に切り替えることができます。

新しいスタート画面のエクスペリエンス

IDE を起動すると、新しい [スタート] ウィンドウが表示されます。 最近使ったプロジェクトを開く、ソース管理からコードを複製する、ローカル コードをソリューションまたはフォルダーとして開く、または新しいプロジェクトを作成するオプションがあります。 [新しいプロジェクト] ダイアログも改善され、検索第一でフィルタリング可能になりました。

一部のプロジェクト テンプレートの新しい名前

更新した [新しいプロジェクト] ダイアログ ボックスに合わせて、プロジェクト テンプレートの名前と説明をいくつか変更しました。

さまざまな生産性の向上

Visual Studio 2019 では、コードをもっと簡単に、もっと直観的に記述できるように次の機能が追加されました。

  • クイック修正:
    • 不足している #include の追加
    • NULLnullptr
    • 不足しているセミコロンの追加
    • 不足している名前空間または範囲の解決
    • 無効な間接参照オペランドを置換 (*& に、&* に)
  • 右括弧にカーソルを置くと、ブロックのクイック インフォが表示
  • ヘッダー/コード ファイルの表示
  • #include の [定義へ移動] でファイルが開く

詳細については、「C++ Productivity Improvements in Visual Studio 2019 Preview 2」 (Visual Studio 2019 プレビュー 2 の C++ 生産性向上) を参照してください。

CMake サポート

  • CMake 3.14 のサポート

  • Visual Studio では、CMakeGUI などの外部ツール、カスタマイズされたメタビルド システム、cmake.exe をそれ自体で呼び出すビルド スクリプトによって生成された既存の CMake キャッシュを開けるようになりました。

  • 強化された IntelliSense パフォーマンス。

  • 新しい設定エディターでは、CMakeSettings.json ファイルの手動編集の代わりになるもの、CMakeGUI と同等の機能が提供されます。

  • Visual Studio では、Linux コンピューター上に互換性のある CMake のバージョンがあるかどうかが検出されることにより、Linux で CMake による C++ の開発を始めやすくなりました。 ない場合は、インストールすることができます。

  • CMakeSettings での互換性のない設定 (アーキテクチャの不一致や、互換性のない CMake ジェネレーターの設定など) に対しては、JSON エディターおよびエラー一覧のエラーで波線が表示されます。

  • vcpkg integrate install を実行した後は、vcpkg ツール チェーンが自動的に検出され、IDE で開かれる CMake プロジェクトに対して有効になります。 この動作は、CMakeSettings で空のツールチェーン ファイルを指定することによりオフにできます。

  • CMake プロジェクトでは、"マイ コードのみ" デバッグが既定で有効になるようになりました。

  • CMake プロジェクトのスタティック分析の警告をバックグラウンドで処理し、エディターに表示できるようになりました。

  • CMake プロジェクトのビルドと構成の "開始" および "終了" に関するいっそう明確なメッセージと、Visual Studio のビルドの進行状況 UI のサポート。 さらに、[出力] ウィンドウに表示される CMake のビルドおよび構成に関するメッセージの詳細レベルをカスタマイズできる CMake の詳細設定が、[ツール] > [オプション] に追加されました。

  • CMake のコマンド ラインを手動で変更することなくツールチェーンを指定するための cmakeToolchain の設定が、CMakeSettings.json でサポートされるようになりました。

  • 新しい [すべてビルド] メニューのショートカット 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 Active Server Page コンポーネント ウィザード
    • ATL OLE DB プロバイダー ウィザード
    • ATL プロパティ ページ ウィザード
    • ATL OLE DB コンシューマー ウィザード
    • MFC ODBC コンシューマー
    • ActiveX コントロールの MFC クラス
    • TypeLib からの MFC クラス。

    これらのテクノロジのサンプル コードは、Microsoft Learn および VCSamples GitHub リポジトリにアーカイブされています。

  • Windows 8.1 ソフトウェア開発キット (SDK) は、Visual Studio インストーラーでは使用できなくなりました。 最新の Windows SDK に C++ プロジェクトをアップグレードすることをお勧めします。 8\.1 に対するハードな依存関係がある場合は、Windows SDK アーカイブからダウンロードできます。

  • 最新の C++ ツールセットでは、Windows XP を対象にできなくなります。 VS 2017 レベルの MSVC コンパイラとライブラリによる VS の対象指定はまだサポートされており、[個別のコンポーネント] を使用してインストールできます。

  • ドキュメントでは、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 ツールチェーンを使用します。

コード分析

単体テスト

マネージド C++ テスト プロジェクト テンプレートは使用できなくなります。 既存のプロジェクトでは、マネージド C++ テスト フレームワークを引き続き使用できます。 新しい単体テストでは、Visual Studio でテンプレートが提供されているネイティブ テスト フレームワークのいずれか (MSTest、Google Test) またはマネージド C# テスト プロジェクト テンプレートの使用を検討してください。