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

演算子 'operator-name': 異なる型の列挙体間で非推奨とされました

解説

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

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

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