【问题标题】:operator== order in C++运算符== C++ 中的顺序
【发布时间】:2016-01-24 01:07:32
【问题描述】:

使用operator== 订购有什么不同吗?

我遇到了一个旧考试,上面写着:

注意*it1 == *it2*it2 == *it1 不同

it1 在这种情况下是某种类型的迭代器 IT1it2 是某种类型的迭代器 IT2IT1 it1IT2 it2 被当作函数的参数,其中 IT1 可以与 IT2 相同。示例代码:

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

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

【问题讨论】:

  • 可能与分配运算符=混淆了?
  • 如果 == 运算符以不再可交换的方式重载,可能会有所不同。

标签: c++ iterator operators


【解决方案1】:

好吧,实际上运算符重载可能会产生意想不到的结果。考虑以下几点:

#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;
}

这里实际上调用了两个不同 operator==。

【讨论】:

  • 这种行为是怎么出乎意料的?
【解决方案2】:

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

操作符左右两边的值怎么可能有关系呢?这与他们是否平等无关。

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

【讨论】:

    【解决方案3】:

    是的,可能会有所不同,因为operator== 的给定实现可能是不对称的。一般来说,这不是一个很好的编码方式,但它可能会发生。 == 对于像 int 这样的原始类型是对称的,但对于用户定义的类,任何事情都可能发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      相关资源
      最近更新 更多