2016-11-15 34 views
-2

由於比較浮點的不穩定性,我希望在使用比較運算符時至少有一個警告。如何刪除浮點變量的運算符==(和!=)

例子:

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

爲什麼你想重載一個內置類型的操作符? –

+9

你是什麼意思*由於浮點比較的未定義行爲*?浮點比較中沒有未定義的行爲。 – NathanOliver

+6

比較花車不是UB。這甚至不是內在的錯誤。它只有很高的潛力,不能按照你想要的方式工作。 – harold

回答

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

+0

很好的例子。我改變了我的問題以反映這一點。它仍然至少會發出警告,讓開發人員意識到他可能會做一些不穩定的事情。 – Davidius

+0

@Davidius我找到了GCC的標誌來啓用此警告。我猜也有類似的MSVC存在。 – HolyBlackCat

+0

哦,不錯,這就是我正在尋找的。希望我能在MSVC中找到它。 – Davidius