コンパイラの警告 (レベル 4) C5054

演算子 'operator-name': 異なる型の列挙型間で非推奨

解説

C++20 では、オペランドに対する通常の算術変換が非推奨になりました。一方のオペランドは列挙型で、もう 1 つは異なる列挙型です。 詳細については、「C++ 標準提案 のP1120R0」を参照してください。

Visual Studio 2019 バージョン 16.2 以降では、コンパイラ オプションが有効になっている場合、列挙型間の暗黙的な変換によってレベル 4 の /std:c++latest 警告が生成されます。 Visual Studio 2019 バージョン 16.11 以降では、/std:c++20

Visual Studio 2019 バージョン 16.2 以降では、次のコードでは、コンパイラ オプションが有効になっていると、レベル 4 の /std:c++latest 警告が生成されます。 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);
}