非临时右值设计模式?

时间:2016-11-02 21:05:59

标签: c++ rvalue

我正在编写一个类似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的整个点是它意味着它是临时值的类型签名本质上可修改的。

任何人都可以建议这种情况的设计模式,其中函数返回值是非临时值(例如查看其他内容),但是您还想使用右值优化吗?

0 个答案:

没有答案