コンパイラの警告 (レベル 4) C5054
演算子 'operator-name': 異なる型の列挙型間で非推奨
解説
C++20 では、オペランドに対する通常の算術変換が非推奨になりました。一方のオペランドは列挙型で、もう 1 つは異なる列挙型です。 詳細については、「C++ 標準提案の P1120R0」を参照してください。
Visual Studio 2019 バージョン 16.2 以降では、 /std:c++latest
コンパイラ オプションが有効になっている場合、列挙型間の暗黙的な変換によってレベル 4 の警告が生成されます。 Visual Studio 2019 バージョン 16.11 以降では、 /std:c++20
で警告も生成されます。
例
Visual Studio 2019 バージョン 16.2 以降では、次のコードでは、 /std:c++latest
コンパイラ オプションが有効になっていると、レベル 4 の警告が生成されます。 Visual Studio 2019 バージョン 16.11 以降では、 /std:c++20
の下に警告も生成されます。
// C5054.cpp
// Compile using: cl /EHsc /W4 /std:c++latest C5054.cpp
enum E1 { a };
enum E2 { b };
int main() {
int i = a | b; // warning C5054: operator '|': deprecated between enumerations of different types
}
この警告を回避するには、static_cast
を使用して 2 番目のオペランドを変換します。
// C5054_fixed.cpp
// Compile using: cl /EHsc /W4 /std:c++latest C5054_fixed.cpp
enum E1 { a };
enum E2 { b };
int main() {
int i = a | static_cast<int>(b);
}