【发布时间】:2014-03-06 22:15:38
【问题描述】:
根据this 博客——我意识到它已经过时了,如果它不再被认为是相关的,请告诉我——实现二元运算符的最佳方法如下......
// The "usual implementation"
Matrix operator+(Matrix const& x, Matrix const& y)
{ Matrix temp = x; temp += y; return temp; }
// --- Handle rvalues ---
Matrix operator+(Matrix&& temp, const Matrix& y)
{ temp += y; return std::move(temp); }
Matrix operator+(const Matrix& x, Matrix&& temp)
{ temp += x; return std::move(temp); }
Matrix operator+(Matrix&& temp, Matrix&& y)
{ temp += y; return std::move(temp); }
我测试了这个实现,并在如下表达式中......
a + b + c + d
它们都是矩阵,我最终得到了许多我认为没有必要的移动构造函数和析构函数调用。如果所有带有右值矩阵的 operator+ 的返回类型都更改为 Matrix&&,则您消除了所有移动构造函数,并且只需要一个析构函数调用。
我用代码here做了一个简单的程序来展示这两种实现。
谁能解释这样做是否错误/不好,为什么?我想不出为什么不这样做的理由。它节省了许多构造函数和析构函数调用,而且似乎没有破坏任何东西。
【问题讨论】:
-
operator+(Matrix const& x, Matrix const& y)会返回什么?我希望不是对temp的引用。另外,如果有人写Matrix&& x = a + b + c; DoSomething(x);他们会很糟糕;x在初始化后不久就变成了一个悬空引用。 -
@IgorTandetnik 可以从右值引用初始化左值引用吗?
-
@Jay:我在发布后不久就修复了它。你打败了我。诚然,这是一个相当牵强的场景。
-
operator+(Matrix const& x, Matrix const& y) 仍然返回左值,如上所示。在这种情况下,您最终会调用一个复制构造函数和一个移动构造函数调用。编辑:你改变了它。这似乎有点令人担忧,但我想不出创建矩阵 && 并保存它的理由。