插入运算符后,垃圾出现在向量中

Art*_*ium 3 c++

我有一个对象,其运算符定义如下:

P& operator +(const P &rhs) {
    return P(x + rhs.x, y + rhs.y, z + rhs.z);
}
Run Code Online (Sandbox Code Playgroud)

它没有自定义复制或赋值运算符.

在向量中直接指定添加的结果后,垃圾会出现在其中.

P p1(1.0, 0.0, 0.0);
P p2(0.0, 0.0, 0.0);

vector<P> v(1);
v[0] = p1 + p2; // v[0] now contains garbage.
Run Code Online (Sandbox Code Playgroud)

如果我通过一个变量来做,一切都如预期的那样.

vector<P> u(1);
P q = p1 + p2;
u[0] = q; // u[0] contains correct value.
Run Code Online (Sandbox Code Playgroud)

这种行为的原因是什么?这两种情况有什么区别?

thi*_*ton 10

您返回对临时的引用.这是一个坏主意,因为临时超出了函数末尾的范围(在这种情况下,operator+函数).将您的运营商声明为:

P operator +(const P &rhs) const
Run Code Online (Sandbox Code Playgroud)

代替.

  • @Artium:这是[未定义行为]的本质(http://en.wikipedia.org/wiki/Undefined_behavior) - 有时可能会_appear_工作,但它永远不会正确. (2认同)