コンパイラの警告 (レベル 1) C5055
演算子 'operator-name': 列挙型と浮動小数点型の間で非推奨
解説
C++20 では、オペランドに対する通常の算術変換が非推奨になりました。一方のオペランドは列挙型で、もう 1 つは浮動小数点型です。 詳細については、「C++ 標準提案の P1120R0」を参照してください。
Visual Studio 2019 バージョン 16.2 以降では、 /std:c++latest
コンパイラ オプションが有効になっている場合、列挙型と浮動小数点型の間で暗黙的な変換によってレベル 1 の警告が生成されます。 Visual Studio 2019 バージョン 16.11 以降では、 /std:c++20
で警告も生成されます。
例
Visual Studio 2019 バージョン 16.2 以降では、列挙型と浮動小数点型の間のバイナリ操作では、 /std:c++latest
コンパイラ オプションが有効になっていると、レベル 1 の警告が生成されます。 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;
}