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

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

解説

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

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

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