コンパイラの警告 (レベル 1) C5055

演算子 'operator-name': 列挙型と浮動小数点型の間で非推奨とされました

解説

C++20 では、オペランドの通常の算術変換は非推奨とされました。一方のオペランドは列挙型で、もう一方は浮動小数点型です。 詳細については、「C++ 標準提案 P1120R0」を参照してください

2019 Visual Studio 16.2 以降では、コンパイラ オプションが有効になっている場合、列挙型と浮動小数点型の間で暗黙的に変換すると、レベル 1 /std:c++latest の警告が生成されます。 2019 Visual Studio 16.11 以降では、 でも警告が生成されます/std:c++20

2019 Visual Studio 16.2 以降では、コンパイラ オプションが有効になっている場合、列挙型と浮動小数点型の間のバイナリ操作によってレベル 1 /std:c++latest の警告が生成されます。 2019 Visual Studio 16.11 以降では、 でも 警告が生成されます/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
}

この警告を回避するには、static_cast を使用して 2 番目のオペランドを変換します。

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