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