Microsoft C++ (MSVC) ビルド ツールでの C/C++ 準拠の機能強化、動作の変更、バグ修正

Microsoft C++ (MSVC) ビルド ツールは、すべてのリリースで準拠の改善とバグ修正を行います。 Visual Studio 2026 バージョン 18.0 以降では、MSVC ビルド ツールのバージョン番号によって大幅な改善が行われました。 特定のバージョンの変更に直接移動するには、この記事の上部にある この記事 のリンクを使用します。

以前のバージョンの Visual Studio での変更の場合:

バージョン [準拠の改善] リンク
2022 Visual Studio 2022 での C++ 準拠の機能強化
2019 Visual Studio 2019 での C++ 準拠の強化
2017 Visual Studio 2017 での C++ 準拠の強化
2003-2015 2003 から 2015 での Visual C++ の新機能

MSVC ビルド ツール v14.50 での C++ 準拠の機能強化、動作の変更、バグ修正

MSVC Build Tools v14.50 では、より優れた C++23 標準準拠、信頼性の向上、正確性の向上など、MSVC コンパイラと標準ライブラリの機能強化が導入されています。 このリリースには、大規模な C++ 開発に役立つ多数のバグ修正と更新プログラムも含まれています。

このバージョンは、最初に Visual Studio 2026 バージョン 18.0 に付属しており、MSVC コンパイラのバージョン 19.50 が含まれています。

このリリースの主なハイライトは次のとおりです。

  • 高度な C++23 機能のサポートには、auto(x)減衰コピーおよび#warningディレクティブのサポートが含まれています。
  • 特に仮想関数に対する包括的な constexpr の機能強化。
  • C++ モジュールの主な安定性の向上。
  • 広範な信頼性が修正され、内部コンパイラ エラーが削減されます。
  • マネージド コード シナリオに対する C++/CLI のサポートが強化されました。
  • Microsoft C++ 標準ライブラリ (MSVC STL) では、Windows 7/Server 2008 R2、Windows 8/Server 2012、または Windows 8.1/Server 2012 R2 をターゲットにすることはサポートされなくなりました。
  • Windows 10/Server 2016 は、サポートされている最小オペレーティング システムです。

標準ライブラリのパフォーマンスの向上、バグ修正、および準拠の更新の詳細については、定期的に更新される STL Changelog を参照してください。

C++23 の機能

MSVC Build Tools v14.50 では、いくつかの C++23 機能のサポートが追加され、コンパイラは完全な C++23 準拠に近づいています。

P0849R8: auto(x) - 言語の減衰コピー

P0849R8では、 減衰コピー操作の auto(x) 構文が言語で直接導入され、減衰コピー セマンティクスをより簡潔に表現できます。

P0849R8の前は、あなたは減衰操作を明示的に実行する必要がありました。

// Before P0849R8:
void pop_front_alike(auto& x)
{
    using T = std::decay_t<decltype(x.front())>;
    std::erase(x, T(x.front()));
}

P0849R8後、より単純な auto(x) 構文を使用できます。

// After P0849R8:
void pop_front_alike(auto& x)
{
    std::erase(x, auto(x.front()));
}

この機能は、減衰コピー操作を実行する標準化された方法を提供し、コードをより読みやすくし、詳細なテンプレート メタプログラミングの必要性を減らします。

P2437R1: C++23 #warning ディレクティブ

P2437R1 は C++23 #warning プリプロセッサ ディレクティブを実装し、コンパイル時に警告を出力する標準的な方法を提供します。

// Valid before C++23.
#error bad configuration...

// Valid after C++23.
#warning configuration deprecated...

#warning ディレクティブを使用すると、コンパイルを停止せずに診断メッセージを出力できるため、非推奨の通知や構成の警告に役立ちます。 詳細については、「 #warning ディレクティブ (C/C++)」を参照してください。

CWG 問題 2586: 割り当てと比較のための明示的なオブジェクト パラメーター

CWG 問題 2586 では、代入演算子と比較演算子で明示的なオブジェクト パラメーターを使用できるため、より柔軟な演算子定義が可能になります。

struct S
{
  S& operator=(this S&, const S&) = default; // Valid after CWG2586.
  auto operator<=>(this const S&, const S&) = default; // Valid after CWG2586.
};

この変更により、代入演算子と比較演算子で明示的なオブジェクト パラメーター構文 (deducing this) を使用して、さまざまな種類のメンバー関数でより一貫性のある構文を提供できます。

P2266R1: より単純な暗黙的な移動

P2266R1 が導入されると、以前は左辺値として扱われていたコードが xvalue または prvalue として見なされる可能性があります。 例えば次が挙げられます。

#include <utility>

template<typename T>
T& f(T&& t)
{
   return t;
}

struct S { };

void g()
{
   S s1{ };
   S& s2 = f(std::move(s1));
}

C++20 以前では、tの型がS&&であり、return tでのtの使用が glvalue として扱われ、戻り値の型にバインドできるため、このコードはコンパイル可能でした。
C++23 では、 t は xvalue として扱われるので、左辺値参照にバインドすることはできません。
1 つの修正は、関数の戻り値の型を T& から T&& に変更することですが、この関数を呼び出すコードに影響する可能性があります。 別の方法として、この変更に関連付けられている機能テスト マクロを使用します。 例えば次が挙げられます。

#include <type_traits>

template<typename T>
T& f(T&& t)
{
#if defined(__cpp_implicit_move)
   return static_cast<std::remove_reference_t<T>&>(t);
#else
   return t;
#endif
}

キャストを追加することで、戻り値式の値カテゴリが左辺値となり、その結果として戻り値の型にバインドできるようになります。

P2280R4: 定数評価中の不明な値への参照

P2280R4では、 一定の評価中に不明な値への参照が可能になり、 constexpr 評価の制限が緩和されます。

template <typename T, size_t N>
constexpr size_t array_size(T (&)[N])
{
    return N;
}

void check(int const (&param)[3])
{
    constexpr auto s2 = array_size(param); // Previously ill-formed, now accepted as a constant expression after P2280R4.
}

この改善により、特にテンプレート コンテキストで関数パラメーターを処理する場合に、コンパイル時により多くのコードを評価できます。

コンフォーマンスの機能強化

C++ 標準への準拠の向上には、属性、テンプレート、および C++20/C++23 機能の処理が向上しています。

属性のサポート

テンプレートと特殊化の修正

C++20 および C++23 の機能

より小さな適合性更新

MSVC Build Tools v14.50 には、C++ 標準コンプライアンスを強化する、より小さな準拠の機能強化が多数含まれています。

  • CWG2635: 制約付き構造化バインディングのサポート
  • CWG2465: コンストラクターの改善を約束するために渡されたコルーチン パラメーター
  • CWG2496: 参照修飾子と仮想オーバーライドの修正
  • CWG2506: 構造化バインディングと配列 cv 修飾子の修正
  • CWG2507: operator[] サポートの既定の引数
  • CWG2585: 標準要件に合わせて動作を調整する
  • CWG2521: 'operator string-literal identifier' の廃止
  • CWG2528: 宇宙船オペレーターの緩やかな変換ルール
  • P2360R0: エイリアス宣言を許可する init-statement 定義の拡張
  • P2290R3: C++23での文字列リテラルにおける16進数/8進数の区切られたエスケープシーケンスのサポート
  • P2797R0: 同じパラメーター型リストを持つ静的および明示的なオブジェクト メンバー関数に関するCWG2692の解決
  • P2266R3: より単純な暗黙的な移動セマンティクス

バグの修正

C++ モジュール、 constexpr、およびその他の修正プログラムのバグ修正は、MSVC ビルド ツール v14.50 で行われました。

バグ修正の詳細な一覧については、 v14.50 でのコンパイラの機能強化に関する記事を参照してください。

特定の非型テンプレート引数のエンコードが修正されました

/std:c++20以降に影響します。

サブオブジェクトを含む特定の型以外のポインター型テンプレート引数は、リンクの問題や、個別の特殊化であるべきものが競合するサイレントな不適切なコード生成につながる可能性があります。

struct A
{
    int x;
};

struct B
{
    int y;
};

template <auto p> void f();

int main()
{
    static A a;
    static B b;
    constexpr auto px = &a.x;
    constexpr auto py = &b.y;
    f<px>(); // incorrect encoding of argument 'px'
    f<py>(); // incorrect encoding of argument 'py', collided with 'px'.
}

この修正により、 f に対する 2 つの呼び出しで、必要に応じて個別のエンコードが取得されます。

MSVC ビルド ツール v14.50 への移行

MSVC Build Tools v14.50 にアップグレードする場合は、次の破壊的変更と移行ガイダンスを検討してください。

C++23 機能の導入

  • よりクリーンなテンプレート コード用の新しい auto(x) の減衰コピー構文を利用するようにコードを更新する
  • エラーが発生しやすい条件付きコンパイルではなく、非推奨の通知に #warning ディレクティブを使用することを検討してください
  • 演算子での明示的なオブジェクト パラメーターの使用による一貫性の向上を確認する

constexpr の強化機能

  • 既存の constexpr コードは、特に仮想関数で、以前に失敗したコードをコンパイルできるようになりました
  • 新しい最適化の可能性について、一定の評価コードを確認する
  • 静的 constexpr メンバーで正常に動作する可能性がある CRTP パターンを更新する

モジュールの移行

  • C++20 モジュールを使用するプロジェクトでは、安定性と互換性が向上している必要があります
  • ヘッダー ユニットが Unreal Engine 5 などの大規模なコードベースでより確実に機能するようになりました
  • コンパイル パフォーマンスを向上させるために、従来のヘッダーからモジュールへの移行を検討する

コンパイラ診断

  • 以前に診断されていない問題に対して新しい警告が表示される場合がある
  • 使用している場合は、列挙型の使用状況を確認する /Zc:enumTypes
  • フラグが設定される可能性がある暗黙的な変換に依存するコードを更新する

C コードの更新

  • C23 機能は/std:clatestで利用できます。
  • typeof 動作の変更が既存のコードに影響する可能性がある
  • プリプロセッサの使用状況を確認して、新しい __VA_OPT__ 可用性を確認する

フィードバックを提供する

最新の更新プログラムやフィードバックを提供するには、 Visual Studio 開発者コミュニティ にアクセスするか、 visualcpp@microsoft.comのチームにお問い合わせください。 X @visualc または BlueSky @msftcpp.bsky.social に従ってください。

Visual Studio 2026 で MSVC で問題が発生した場合は、インストーラーまたは Visual Studio IDE 自体の [ 問題の報告 ] オプションからお知らせください。

こちらも参照ください

Microsoft C/C++ 言語の準拠
Visual Studio での C++ の新機能
Visual Studio 2022 での C++ 準拠の機能強化