Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果当前对象是r值引用,是否可以返回该对象?_C++_Rvalue Reference - Fatal编程技术网

C++ 如果当前对象是r值引用,是否可以返回该对象?

C++ 如果当前对象是r值引用,是否可以返回该对象?,c++,rvalue-reference,C++,Rvalue Reference,我最近了解了r值参考。为了更彻底地进行实验,我决定编写一个简单的DenseMatrix类。我的问题是,是否可以编写任何函数(本例中的转置),以便为auto A=B.Transpose()返回单独的矩阵,但为auto A=(B+C.Transpose()计算转置的结果?是,您可以在调用对象的ref限定上重载Transpose成员函数: class DenseMatrix { DenseMatrix Transpose() const & { // #1 called on l-v

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

是,您可以在调用对象的ref限定上重载
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
这是一个例子

请注意,可以根据r值重载实现l值重载,如下所示:

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

这里有一个。

为什么不
DenseMatrix&&Transpose()&&
?例如,在适当的位置修改一个r值。@MaximEgorushkin我想到了这一点,但感觉复制省略会解决这个问题。不过我不确定。无论如何都要编辑,因为它至少不会造成伤害。@cigien
是一个隐藏的函数参数,返回函数参数会阻止返回值优化,并且因为此不是具有自动存储持续时间的对象。请参阅:在return语句中,当操作数是具有自动存储持续时间的非易失性对象的名称时,该对象不是函数参数或catch子句参数,并且与函数返回类型具有相同的类类型(忽略cv限定)。这种拷贝省略的变体被称为NRVO,“名为返回值优化”。它的语法限制了对r值调用的函数。事实上,在c++11中引入此语法就是为了实现您想要的效果:)@bar3