比较不等式的向量仅使用向量元素上的等式运算符。为什么?

时间:2014-09-20 21:29:16

标签: c++ c++11

我的编译器(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==,那么它就会编译并运行。

根据标准是这样的吗?

如果是这样,为什么?

1 个答案:

答案 0 :(得分: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<

是的,这是应该的。

至于问题的第二部分(为什么),我实际上并不完全确定为什么如果可用的话,其他运算符都不会被使用。