使用operator==
订购时是否有任何不同?
我遇到了一个旧考试,其中说:
在这种情况下,注意
不同*it1 == *it2
与*it2 == *it1
it1
是某种类型IT1
的迭代器,而it2
是某种类型IT2
的迭代器。 IT1 it1
和IT2 it2
被视为函数的参数,其中IT1
可能与IT2
相同。示例代码:
template <typename IT1, typename IT2>
bool f(IT1 it1, IT2 it2) {
return *it1 == *it2;
}
有什么想法?在我看来,顺序不应该影响operator==
的结果,所以我很困惑。
答案 0 :(得分:4)
是的,可能存在差异,因为operator==
的给定实现可能是不对称的。一般来说,这不是一种很好的编码方式,但它可能会发生。 ==
对于int
等基本类型是对称的,但对于用户定义的类,任何事情都可能发生。
答案 1 :(得分:2)
实际上,运算符重载可能会产生意外结果。请考虑以下事项:
#include <iostream>
class Bar;
class Foo {
public:
Foo() {}
int operator==(const Bar& bar) { std::cout << "foo == bar\n"; return 0; }
};
class Bar {
public:
Bar() {}
int operator==(const Foo& foo) { std::cout << "bar == foo\n"; return 0; }
};
int main()
{
Foo foo;
Bar bar;
foo == bar; // prints "foo == bar"
bar == foo; // prints "bar == foo"
return 0;
}
这里实际上有两个不同的运算符==被调用。
答案 2 :(得分:1)
==
运算符测试运算符两边的值是否相等。
操作员左右两侧的值有多大可能?这与他们是否平等无关。
当然,您可能会使运算符超载以产生一些非标准行为,在这种情况下它可能很重要。但这将是一个糟糕的方法,并且不会明确哪个值应该在左侧,哪个值应该在运算符的右侧。