Compartir a través de


Advertencia del compilador (nivel 4) C5054

operador "operator-name": en desuso entre enumeraciones de tipos diferentes

Comentarios

C++20 dejó en desuso las conversiones aritméticas usuales en los operandos, en las que un operando es de tipo de enumeración y el otro tiene un tipo de enumeración diferente. Para más información, consulte la propuesta del estándar de C++ P1120R0.

En la versión 16.2 y posteriores de Visual Studio 2019, una conversión implícita entre los tipos de enumeración genera una advertencia de nivel 4 cuando la opción del compilador /std:c++latest está habilitada. En la versión 16.11 y posteriores de Visual Studio 2019, también genera una advertencia en /std:c++20.

Ejemplo

En la versión 16.2 y posteriores de Visual Studio 2019, el código siguiente genera una advertencia de nivel 4 cuando la opción del compilador /std:c++latest está habilitada. En la versión 16.11 y posteriores de Visual Studio 2019, también genera una advertencia en /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
}

Para evitar la advertencia, use static_cast para convertir el segundo operando:

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