Предупреждение компилятора (уровень 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);
}