C++ 如果当前对象是r值引用,是否可以返回该对象?
我最近了解了r值参考。为了更彻底地进行实验,我决定编写一个简单的DenseMatrix类。我的问题是,是否可以编写任何函数(本例中的转置),以便为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
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