如果当前对象是右值引用,是否可以 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。
我最近了解了 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。