Aviso do compilador (nível 4) C5054
operador 'operator-name': preterido entre enumerações de diferentes tipos
Comentários
O C++20 preteriu as habituais conversões aritméticas em operandos, onde um operando é do tipo enumeração e o outro é de um tipo de enumeração diferente. Para obter mais informações, confira a proposta C++ Padrão P1120R0.
No Visual Studio 2019 versão 16.2 e posterior, uma conversão implícita entre os tipos de enumeração produz um aviso de nível 4 quando a opção do compilador /std:c++latest
é habilitada. No Visual Studio 2019 versão 16.11 e posterior, ela também produz um aviso sob /std:c++20
.
Exemplo
No Visual Studio 2019 versão 16.2 e posterior, o seguinte código produz um aviso de nível 4 quando a opção do compilador /std:c++latest
é habilitada. No Visual Studio 2019 versão 16.11 e posterior, ela também produz um aviso em /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 o aviso, use static_cast
para converter o 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);
}