Partage via


Avertissement du compilateur (niveau 4) C5054

opérateur 'operator-name' : déconseillé entre les énumérations de différents types

Notes

C++20 a déprécié les conversions arithmétiques habituelles sur les opérandes, où un opérande est de type énumération et l’autre est d’un type d’énumération différent. Pour plus d’informations, consultez la proposition C++ Standard P1120R0.

Dans Visual Studio 2019 version 16.2 et ultérieure, une conversion implicite entre les types d’énumération génère un avertissement de niveau 4 lorsque l’option du /std:c++latest compilateur est activée. Dans Visual Studio 2019 version 16.11 et ultérieure, il génère également un avertissement sous /std:c++20.

Exemple

Dans Visual Studio 2019 version 16.2 et ultérieure, le code suivant génère un avertissement de niveau 4 lorsque l’option du /std:c++latest compilateur est activée. Dans Visual Studio 2019 version 16.11 et ultérieure, il génère également un avertissement sous /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
}

Pour éviter l’avertissement, utilisez static_cast pour convertir le deuxième opérande :

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