operator== c++中的顺序

operator== order in C++

本文关键字:顺序 c++ operator      更新时间:2023-10-16

operator==的顺序有什么不同吗?

我看到一个旧的考试,上面写着:

观察到*it1 == *it2*it2 == *it1不相同

it1IT1类型的迭代器,it2IT2类型的迭代器。IT1 it1IT2 it2作为函数的参数,其中IT1可以与IT2相同。示例代码:

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

任何想法吗?在我的脑海中,顺序不应该影响operator==的结果,所以我很困惑。

是的,可能存在差异,因为给定的operator==实现可能是不对称的。一般来说,这不是一种很好的编码方式,但它可能发生。对于像int这样的基本类型,==是对称的,但是对于用户定义的类,任何事情都可能发生。

实际上,操作符重载可能会产生意想不到的结果。考虑以下内容:

#include <iostream>
class Bar;
class Foo {
public:
    Foo() {}
    int operator==(const Bar& bar) { std::cout << "foo == barn"; return 0; }
};
class Bar {
public:
    Bar() {}
    int operator==(const Foo& foo) { std::cout << "bar == foon"; return 0; }
};
int main()
{
    Foo foo;
    Bar bar;
    foo == bar; // prints "foo == bar"
    bar == foo; // prints "bar == foo"
    return 0;
}

这里实际上调用了两个不同的运算符==

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

哪个值放在操作符的左右两边怎么可能有关系呢?这与它们是否相等无关。

当然,您可以重载操作符以获得一些非标准行为,在这种情况下,这可能很重要。但这将是一种糟糕的方法,并且无法明确哪些值应该放在操作符的左侧,哪些值应该放在操作符的右侧。