operator == C ++中的order

时间:2015-10-24 16:04:39

标签: c++ iterator operators

使用operator==订购时是否有任何不同?

我遇到了一个旧考试,其中说:

  

注意*it1 == *it2*it2 == *it1

不同
在这种情况下,

it1是某种类型IT1的迭代器,而it2是某种类型IT2的迭代器。 IT1 it1IT2 it2被视为函数的参数,其中IT1可能与IT2相同。示例代码:

template <typename IT1, typename IT2>
bool f(IT1 it1, IT2 it2) {
    return *it1 == *it2;
}

有什么想法?在我看来,顺序不应该影响operator==的结果,所以我很困惑。

3 个答案:

答案 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)

==运算符测试运算符两边的值是否相等。

操作员左右两侧的值有多大可能?这与他们是否平等无关。

当然,您可能会使运算符超载以产生一些非标准行为,在这种情况下它可能很重要。但这将是一个糟糕的方法,并且不会明确哪个值应该在左侧,哪个值应该在运算符的右侧。