我的编译器(g ++和clang)都不会编译它:
#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);
}
错误是stl_algobase.h中某处的!(*__first1 == *__first2)
无效。
换句话说,它完全忽略了A
的现有运算符!=。
毋庸置疑,如果我定义operator==
,那么它就会编译并运行。
根据标准是这样的吗?
如果是这样,为什么?
答案 0 :(得分:6)
这是因为the comparison operators需要EqualityComparable
或LessThanComparable
类型。
仅使用==
和<
,您可以推导出等效的!=
,<=
,>=
和>
。换句话说,通过仅实现2个运算符,您可以进行所有6次比较(假设我没有在逻辑中出错):
(a != b) is !(a == b)
(a <= b) is !(b < a)
(a >= b) is !(a < b)
(a > b) is (b < a)
标准容器通常使用此功能,并在对类型进行比较时使用operator==
和operator<
。
是的,这是应该的。
至于问题的第二部分(为什么),我实际上并不完全确定为什么如果可用的话,其他运算符都不会被使用。