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