2014-09-20 49 views
6

我的兩個編譯器(g ++以及鐺)將無法編譯如下:比較向量不等式只使用向量元素上的相等運算符。爲什麼?

#include <vector> 

struct A { 
    friend bool operator!=(A const& a1, A const& a2) { return false; } 
}; 

int main() 
{ 
    std::vector<A> v1, v2; 
    return (v1 != v2); 
} 

的錯誤之處在於!(*__first1 == *__first2)在stl_algobase.h地方是無效的。

換句話說,它完全忽略了現有的運營商!= A。 不用說,如果我定義了operator==那麼它編譯和工作。

這是應該如何按照標準?

如果是這樣,爲什麼?

+0

op ==和op!=的重載是獨立的,沒有會自動定義的。標準庫編寫者做出了明智的決定,只使用其中的一個,併爲用戶提供另一個。 – Deduplicator 2014-09-20 21:33:37

+1

標準容器上的'a!= b'被指定爲等同於'!(a == b)',並且'a == b'被指定爲'std :: equal(a.begin(),a。 end(),b.begin(),b.end())',指定使用'=='進行比較。 – 2014-09-20 21:38:47

回答

6

這是因爲the comparison operators想要一個EqualityComparableLessThanComparable類型。

由於只有==<,可以產生相當於!=<=>=>。換句話說,通過僅實現2個運營商,你可以得到所有6個比較(假設我沒有在邏輯犯了一個錯誤):

(a != b) is !(a == b) 
(a <= b) is !(b < a) 
(a >= b) is !(a < b) 
(a > b) is (b < a) 

標準集裝箱使用這通常,並將使用operator==operator<時對類型進行比較。

所以是的,這是應該的。

至於問題的第二部分(爲什麼),實際上,我不能完全肯定爲什麼其他運營商如果有不被使用。

+1

現在,如果你解釋了爲什麼其他人不能自動合成......那麼這可能會成爲一個很好的答案。 – Deduplicator 2014-09-20 21:34:15

+0

@ T.C .:好的,我補充說。 – Cornstalks 2014-09-20 21:40:32

+1

你可能會在修復'> ='的時候處理它。實現這些運算符的通常方法可以在['std :: rel_ops'](http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp)中看到。不是任何人實際上使用'rel_ops' ... – Blastfurnace 2014-09-20 21:43:36