我正在编写一个类似C ++矩阵的类来分配内存,并且有方法(例如 <select ng-model="myColor" ng-options="color.name for color in colors"></select>
,row()
),它返回通过col()
引用相同内存的自身视图。< / p>
e.g。
shared_ptr
基本问题是C ++将Matrix Matrix::row(int r)
这样的表达式视为右值,而m.row(0)
的返回类型不是可以移动的自包含临时值,而是视图(带有共享内存)到非临时父矩阵。
只要我想使用移动语义,问题就会出现,例如:
row()
如果我写Matrix add(const Matrix &a, const Matrix &b);
Matrix add(Matrix &&a, Matrix &&b);
,编译器将调用add(m.row(0), m.row(1))
的右值版本,这可能会修改它的临时参数,因此非临时父矩阵m! : - (
我不想避开rvalues并且总是通过值传递:
add()
因为虽然这有效地处理了rvalue情况(通过移动构造),但这也意味着我总是复制非低效的非右值。
我也不想创建Matrix add(Matrix a, Matrix b);
const的返回类型,因为我希望能够将它视为左值:
row()
我已经考虑过明确地测试rvalue参数是否是m.row(0) = m.row(1);
shared_ptr
的视图,但这看起来很混乱,因为rvalues的整个点是它意味着它是临时值的类型签名本质上可修改的。
任何人都可以建议这种情况的设计模式,其中函数返回值是非临时值(例如查看其他内容),但是您还想使用右值优化吗?