我的编译器(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==然后它编译和工作.
这是根据标准应该如何?
如果是这样,为什么?
这是因为比较运算符需要一个EqualityComparable或LessThanComparable类型.
只有==和<,你可以派生等价的!=,<=和>=,和>.换句话说,通过仅实现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<做比较的类型时.
是的,这是应该的.
至于问题的第二部分(原因),我实际上并不完全确定为什么不使用其他运算符.
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |