operator ==在引用和复制之间具有不同的行为

时间:2014-07-30 18:55:17

标签: c++ reference operator-overloading

让我们想象一个简单的类,例如:

class Foo {
public:
    Foo(int b) : bar(b) {}
    int bar;

    friend bool operator==(const Foo& l, const Foo& r); 
};

bool operator==(const Foo& l, const Foo& r) {
    return l.bar == r.bar;
}

我对操作符有一种奇怪的行为==将对象与具有相同bar值的另一个对象进行比较并不会返回true。

要理解,请考虑以下代码:

Foo& findRef(int barToFind); //Assume those functions works correctly
Foo findCopy(int barToFind);

Foo f1(1);

Foo& fRef = findRef(1);
Foo fCopy = findCopy(1);

f1 == fRef; //Will evaluate to false
f1 == fCopy; //Will evaluate to true

为什么?我错过了什么?此代码已在Visual Studio 2013上进行了测试。

谢谢

编辑:提供的是findRef函数。 findCopy完全相同,只是它没有返回引用。 MyArray保证在该计划期间存活。

Foo& findRef(int bar) {
    //MyArray of type std::vector<Foo>
    auto it = std::find_if(std::begin(MyArray), std::end(MyArray), [=](const Foo& f){ return f.bar == bar; });
    assert(it != std::end(MyArray));

    return *it;
}

0 个答案:

没有答案