<&书信电报;运营商没有';无法正确计算表达式 我在C++中做了一个向量类,我的问题是如果我做了< /p> Vector v = v1 + v2; cout << v

<&书信电报;运营商没有';无法正确计算表达式 我在C++中做了一个向量类,我的问题是如果我做了< /p> Vector v = v1 + v2; cout << v,c++,stream,overloading,operator-keyword,C++,Stream,Overloading,Operator Keyword,和按值返回新向量: Vector operator+ (const Vector& v1, const Vector& v2) // ^ no '&' 您正在返回对局部变量的引用,该引用在您可以使用该引用时已被销毁。编译器应该对此发出警告;确保编译时启用了所有合理的警告。在操作符+中,您将返回对具有自动持续时间的局部变量的引用。这是未定义的行为。你应该按值返回。谢谢,我的编译器什么也没告诉我。所以,据我所知,我所做的是有效的,但并不总是有效的,因为做这种事情是“未

和按值返回新向量:

Vector operator+ (const Vector& v1, const Vector& v2)
//    ^ no '&'

您正在返回对局部变量的引用,该引用在您可以使用该引用时已被销毁。编译器应该对此发出警告;确保编译时启用了所有合理的警告。

操作符+
中,您将返回对具有自动持续时间的局部变量的引用。这是未定义的行为。你应该按值返回。谢谢,我的编译器什么也没告诉我。所以,据我所知,我所做的是有效的,但并不总是有效的,因为做这种事情是“未定义的”,或者有其他解释为什么它在某些情况下有效?编译器一定提出了警告@Ajay:仅当启用了警告时。遗憾的是,某些编译器在默认情况下不启用它们。@user3758262:使用已销毁的对象确实是未定义的行为。如果对象的内存没有被重用,那么它可能看起来“工作”,因此它仍然包含一些看起来像死对象的东西。在第一种情况下,立即将其复制到局部变量;很有可能在那个时候它还没有被重用,所以它看起来“起作用”。在第二部分中,您将引用传递到
好的,非常感谢。我使用的是vs2013,现在我将警告级别更改为4,实际上我收到了此警告
ostream& operator<< (ostream& o, const Vector& v) {
    o << "[" << v.x << " " << v.y << " " << v.z << "]; ";
    return o;
}
Vector operator+ (const Vector& v1, const Vector& v2)
//    ^ no '&'