编译器警告(等级 4)C5054

运算符'operator-name':已在不同类型的枚举之间弃用

备注

C++20 已启用操作数的常规算术转换,其中一个是枚举类型,另一个是不同的枚举类型。 有关详细信息,请参阅 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 转换第二个操作数:

// 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);
}