Да, вы можете иметь дополнительные перегрузки
Matrix/*&&*/ operator+(const Matrix&, Matrix&&);
Matrix/*&&*/ operator+(Matrix&&, const Matrix&);
Matrix/*&&*/ operator+(Matrix&&, Matrix&&);
Для повторного использования памяти одного из временных.
Все они могут быть реализованы с помощью Matrix& operator += (Matrix&, const Matrix&)
, изменив порядок на + симметрично , operator -
потребуется выделенный код.
Другой способ оптимизировать память - использовать шаблоны выражений вместо непосредственного вычисления результата.
У него есть недостаток, связанный с проблемой времени жизни. (особенно с auto
), хотя.