プロジェクトの設定で「ISO C++ 20 標準(/std:c++20)」を選択してもC++17, C++20の機能が使えない

Visual Studio Community 2022 (64 ビット) Version 17.6.2において、プロジェクトの設定の

[構成プロパティ]-[全般]-[C++言語標準]
(または[構成プロパティ]-[C/C++]-[言語]-[C++言語標準]。上記と同期しており、どちらを変更しても同じことのようです。)

を「ISO C++ 20 標準(/std:c++20)」にすればC++17~20の機能を使えるようになるという認識なのですが、そうしても何故かコンパイルエラーになってしまいます。
何か設定がおかしいのでしょうか?
ちなみにC++11~14の機能は使えるようです。

C++

1// C++14 constexpr2constexpr unsigned N = 10; // OK

C++

1// C++17 構造化束縛2std::tuple< long, long, long > f() { return { 1, 2, 3 }; }3 4int main()5{6 auto[ a, b, c ] = f();// エラー C2429 言語機能 '構造化バインディング' にはコンパイラ フラグ '/std:c++17' が必要です7}

C++

1// C++20 関数の引数型にauto2void f( auto x ) {} // エラー C3533 パラメーターの型に 'auto' を含めることはできません。

Windows SDKのバージョンについて

Visual Studio に C11 および C17 サポートをインストールする | Microsoft Learn https://learn.microsoft.com/ja-jp/cpp/overview/install-c17-support?view=msvc-170

C11 と C17 のサポートには Windows SDK 10.0.20348.0 (バージョン 2104) 以降が必要です。

これはC言語の話のようですが、C++にもWindows SDKのバージョンが関係ありそうと考え、バージョンを確認しました。

Windows SDK のバージョンを確認する【レジストリなし】 | one euro https://oneuro.net/where-is-windows-sdk-version
上記を参考に、「C:\Program Files (x86)\Windows Kits\10\SDKManifest.xml」にて、「PlatformIdentity = "UAP, Version=10.0.22000.0"」であることを確認しました。

Visual Studio に C11 および C17 サポートをインストールする | Microsoft Learn https://learn.microsoft.com/ja-jp/cpp/overview/install-c17-support?view=msvc-170
> C11 と C17 のサポートには Windows SDK 10.0.20348.0 (バージョン 2104) 以降が必要です。

Windows SDK - Windows アプリ開発 | Microsoft Developer https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/
上記によると最新版(?)は「10.0.22621」のようです。
私の環境は最新ではないですが、8月にWindows Updateを全て行ったので、C++17~20を使うには「十分新しいはず」と判断しました。

その他試したこと

・設定変更後にプロジェクトのクリーンとリビルドを試したが、変化なし。
・[C++言語標準]を「/std:c++17」「/std:c++latest」に変更してみたが、変化なし。
・[C++言語標準]の1つ下にある[C言語標準]も、念のため「既定」から「/std:c17」に変更してみたが、変化なし。

参考サイト

C++の新機能:

・C++11, C++14, C++17 新機能まとめ ~使いそうなものだけ - Qiita https://qiita.com/leon-joel/items/81415c1ef355c6246280
・競プロで役立つC++20新機能 - Qiita https://qiita.com/Chippppp/items/620d2e5229f5c7e93f0c
・コンパイラの実装状況 - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/implementation-status.html
C++20の「関数の引数型にauto」は何故か載っていません…が、載っているC++20の項目は全て対応済みになっているので、autoの件も対応済みではないかと推測しています。

C++の新機能を使うための設定:

下記を見る限り、設定は間違っていないように思えます。
・Visual StudioでC++のバージョン変更 | のんぽぐ https://nompor.com/2019/02/12/post-5105/
・VisualStudio2017はC++17に対応しているがデフォルトでは無効になっている - ぷろみん https://torini.hateblo.jp/entry/2018/09/08/VisualStudio2017%E3%81%AFC%2B%2B17%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8C%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%AA

コメントを投稿

0 コメント