Поделиться через


Предупреждение компилятора (уровень 4) C5054

оператор "operator-name": устарел между перечислениями разных типов

Замечания

C++20 не рекомендует обычные арифметические преобразования в операндах, где один операнд имеет тип перечисления, а другой — другого типа перечисления. Дополнительные сведения см. в P1120R0 предложения C++Standard.

В 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 для преобразования второго операнда:

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