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

Car*_*ood 6 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);
}
Run Code Online (Sandbox Code Playgroud)

错误是!(*__first1 == *__first2)stl_algobase.h 中的某个地方无效.

换句话说,它完全忽略了现有的运算符!= A.不用说,如果我定义一个operator==然后它编译和工作.

这是根据标准应该如何?

如果是这样,为什么?

Cor*_*lks 6

这是因为比较运算符需要一个EqualityComparableLessThanComparable类型.

只有==<,你可以派生等价的!=,<=>=,和>.换句话说,通过仅实现2个运算符,您可以获得所有6个比较(假设我没有在逻辑中出错):

(a != b) is !(a == b)
(a <= b) is !(b < a)
(a >= b) is !(a < b)
(a >  b) is  (b < a)
Run Code Online (Sandbox Code Playgroud)

标准集装箱通常利用这一点,并且将使用operator==operator<做比较的类型时.

是的,这是应该的.

至于问题的第二部分(原因),我实际上并不完全确定为什么不使用其他运算符.