c – 比较不等式的向量仅在向量元素上使用相等运算符.为什么?

我的编译器(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.
不用说,如果我定义一个运算符==那么它编译并运行.

这是根据标准应该如何?

如果是这样,为什么?

最佳答案
这是因为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<在进行类型比较时. 是的,这是应该的. 至于问题的第二部分(原因),我实际上并不完全确定为什么不使用其他运算符.

转载注明原文:c – 比较不等式的向量仅在向量元素上使用相等运算符.为什么? - 代码日志