Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符==在引用和复制之间具有不同的行为_C++_Reference_Operator Overloading - Fatal编程技术网

C++ 运算符==在引用和复制之间具有不同的行为

C++ 运算符==在引用和复制之间具有不同的行为,c++,reference,operator-overloading,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; } 我对操作符==有一种奇怪的行为,其中将一个

让我们想象这样一个简单的类:

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;
}
Foo&findRef(整型条){
//std::vector类型的MyArray
autoit=std::find_if(std::begin(MyArray),std::end(MyArray),[=](const Foo&f){return f.bar==bar;});
断言(it!=std::end(MyArray));
归还它;
}

我认为我们不能假设该函数工作正常。我想是的,你没有说服我。未定义的行为可以“起作用”,而且经常起作用。您可能会返回对本地定义对象的引用,并且所有赌注都将被取消。为了说服自己,声明const-Foo&fRef=findRef(1),可以将常量引用绑定到临时变量,并使临时变量保持活动状态。您的代码可能会工作。请参阅
Foo f1(1):你搞乱了构造函数/脚的赋值。几乎可以肯定,他指向的是通过引用从
findRef
返回的值,该值不存在,这会给你带来未定义的行为。