由于浮点的不稳定性得到比较,我希望在使用比较运算符时至少有一个警告。
示例:
float a,b;
a == b; // Here the warning shall be thrown
我怎么能意识到这一点?
我想过载如下:
inline bool operator==(const float& a, const float& b)
{
#warning "Usage of equal on floating point variables not allowed."
return false;
}
我没有明确说明,但似乎禁止覆盖此运算符,因为MSVC抛出C2803并且gcc抛出"必须有类或枚举类型的参数" (也在Global overloading of == and != for floating-points中描述)。即使有可能,编译器在遇到#error语句时也会抛出错误,即使没有使用它。
答案 0 :(得分:1)
使用自定义运算符重载的方法不起作用,因为如果所有参数都有内置类型,C ++标准禁止自定义运算符重载。
如果你正在使用GCC(或clang / MinGW),你可以使用-Wfloat-equal
启用有关这些比较的警告。这是你能得到的最接近的事情。
即使可以完全禁用它们,也不是一个坏主意。有时它们是有用且完全安全的。特别是如果没有计算。
请考虑以下代码:
float f = 0;
if (a >= -1 && a <= 1)
f = std::asin(a);
// ...
if (f != 0)
std::cout << "asin = " << f << '\n';
else
std::cout << "Out of range.\n";
即使==
与float
一起使用,也完全安全。