Compartilhar via


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