所以..我写一些代码,想知道原型的复合运算符(即类似operator*=
或operator/=
).当我查看它时,我意识到它们应该返回引用.(或者至少我的消息来源表示如下:R& operator +=(K& a, S b);
.)嗯..然后我意识到我的代码中的一行可能比它看起来更危险:
// I have a really fancy Vector class I've been making. :P templateinline Vector operator*(const Vector & vec, T scale) { Vector ret = vec; return ret *= scale; }
所以..我想知道这是否无害......或者会导致对局部变量的引用泄漏并导致各种未定义的行为和一般的破坏.(我倾向于破坏,因此,重写如下.:P)
// I have a really fancy Vector class I've been making. :P templateinline Vector operator*(const Vector & vec, T scale) { Vector ret = vec; ret *= scale; return ret; }
所以..是啊..一般C++"怎么样?" 这里有问题.很高兴知道肯定.(而且我太懒了,不能尝试做一个测试用例,看看我的程序是否停止并着火了.:P)
编辑: 修复上面的代码..我意识到这也可能有助于将所述复合运算符放在这里.:P
templateinline Vector & operator*=(Vector & vec, T scale) { for (int i = 0; i < N; i++) { vec[i] *= scale; } return vec; }
所以...代码更正(并经过双重检查)我想知道是否使用第一个变体仍会导致悬空引用(因为返回类型operator*=
是引用).
按照惯例,复合赋值运算符*=
应该返回对它们修改的对象的引用,因为没有理由进行不必要的复制.也就是说,即使在你修改过的例子中,你也会得到一个"悬空"引用,因为你仍然会返回一个对函数返回后将被销毁的局部变量的引用.您应该按值而不是按引用返回.
templateVector operator*(Vector const& vec, T scale) { Vector ret = vec; return ret *= scale; }
另请注意,ret
如果您通过vec
值传递,则可以删除.如果Vector
可以比可以复制的更有效地移动,则这可以允许更有效的客户端代码.
templateVector operator*(Vector vec, T scale) { return vec *= scale; }