如果当前对象是右值引用,是否可以 return 当前对象?

Is it possible to return the current object if it is an r-value reference?

我最近了解了 r 值引用。为了更彻底的实验我决定写一个简单的DenseMatrixclass。我的问题是,是否可以编写任何函数(本例中为 Transpose),以便为 auto A = B.Transpose() 返回单独的矩阵,但对于 auto A = (B + C).Transpose(),Transpose 的结果是就地计算的?

是的,您可以在调用它的对象的引用限定上重载 Transpose 成员函数:

class DenseMatrix {
 
  DenseMatrix Transpose() const & {  // #1 called on l-values
     auto copy = *this;
     // transpose copy
     return copy;
  }

  DenseMatrix&& Transpose() && {  // #2 called on r-values
     // transpose *this
     return std::move(*this);
  }
};

所以你得到了结果:

B.Transpose();        // calls #1
(B + C).Transpose();  // calls #2

这是 demo

请注意,您可以根据右值重载来实现左值重载,如下所示:

DenseMatrix Transpose() const & {  
  auto copy = *this;
  return std::move(copy).Transpose();
}

这里是 demo