class Widget {
public:
Widget(Widget&& rhs)
: name(std::move(rhs.name)),
p(std::move(rhs.p))
{...}
...
private:
std::string name;
std::shared_ptr<SomeDataStructure> p;
};
class Widget {
public:
template<typename T>
void setName(T&& newName)
{ name = std::forward<T>(newName); }
...
};
如果一个对象需要被使用多次,为了保证对象在其他操作之前,其值不被移走,针对右值引用的最后一次使用实施 std::move
,针对万能引用的最后一次使用实施 std::forward
。
template<typename T>
void setSignText(T&& text) {
sign.setText(text);
auto now =
std::chrono::system_clock::now();
signHistory.add(now,
std::forward<T>(text));
}
作为按值返回的函数的右值引用和万能引用,依上一条所述采取相同行为。
Matrix
operator+(Matrix&& lhs, const Matrix& rhs)
{
lhs += rhs;
return std::move(lhs);
}
template<typename T>
Fraction
reduceAndCopy(T&& frac)
{
frac.reduce();
return std::forward<T>(frac);
}
若局部对象可能适用于RVO,请勿针对其实施 std::move
或 std::forward
。
Widget makeWidget()
{
Widget w;
...
return std::move(w); // 糟糕的设计
}