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
返回的值,该值不存在,这会给你带来未定义的行为。