Compartilhar via


Aviso do compilador (nível 1) C5055

operador 'operator-name': preterido entre enumerações e tipos de ponto flutuante

Comentários

O C++20 preteriu as conversões aritméticas usuais em operandos nas quais um operando é do tipo enumeração e o outro é de um tipo de ponto flutuante. 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 e de ponto flutuante produz um aviso de nível 1 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, uma operação binária entre os tipos de enumeração e de ponto flutuante produz um aviso de nível 1 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:

// C5055.cpp
// Compile using: cl /EHsc /W4 /std:c++latest C5055.cpp
enum E1 { a };
int main() {
  double i = a * 1.1; // Warning C5055: operator '*': deprecated between enumerations and floating-point types
}

Para evitar o aviso, use static_cast para converter o segundo operando:

// C5055_fixed.cpp
// Compile using: cl /EHsc /W4 /std:c++latest C5055_fixed.cpp
enum E1 { a };
int main() {
   double i = static_cast<int>(a) * 1.1;
}