質問に関連する C++ 11サポートの確認方法 および C++ 17の__cplusplusの値は?
コンパイラがC++ 20を使用するように設定されているかどうかを調べるにはどうすればよいですか?原則として、次の方法でC++バージョンを照会できることがわかっています。
#if __cplusplus > ???
// C++20 code here
#endif
どうしたら良い ???
C++ 20向けですか?
それには早すぎます。
標準に置き換えられるまで、次を使用します。
#if __cplusplus > 201703L
// C++20 code
#endif
c ++ 20の定義済みマクロはC++ 17のマクロよりも大きくなるためです。
@SombreroChickenの答えが言及しているように、 [cpp.predefined](1.1) は(emphasis mine)を指定します:
__cplusplus
整数リテラル
201703L
。 [注:この国際標準の将来のバージョンは、このマクロの値をreplaceにすることをintendedgreater値を使用します。]
2018年11月現在、使用されているマクロは次のとおりです。
201709L
C++ 2aの場合。 Live demo201707L
。 Live demo201704L
(@Acornの回答にあるとおり)。PS:特定の機能に興味がある場合は、 [cpp.predefined](1.8) を使用して対応するマクロを定義します。ただし、将来変更される可能性があることに注意してください。
新しい値は [cpp.predefined] p1.1 のある時点で利用可能になります。
__cplusplus
整数リテラル
201703L
。 [注:この国際標準の将来のバージョンは、このマクロの値をより大きな値に置き換えることを意図しています。 —メモを終了]
主要なコンパイラで使用されている現在の値は、2018年11月30日現在です。
201709L
godbolt201707L
godbolt201704L
godbolt (必須 /Zc:__cplusplus
)それらはすべてC++ 17の201703L
、すでに使用できます:
#if __cplusplus > 201703L
// C++20 code
#endif
C++ 20はまだ開発中であるため、__cplusplus
バージョンはまだ知られていません。 C++ 20のドラフトのみがあります。
最新のドラフトN4788 にはまだ以下が含まれています:
__cplusplus
整数リテラル
201703L
。 [注:この国際標準の将来のバージョンは、このマクロの値をより大きな値に置き換えることを意図しています。 —注を終了]
それをチェックするために、私は@gsamarasの回答を使用します。