Skip to content

Latest commit

 

History

History
73 lines (61 loc) · 1.39 KB

File metadata and controls

73 lines (61 loc) · 1.39 KB

条款25:针对右值引用实施std::move,针对万能引用实施std::forward

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::movestd::forward

Widget makeWidget()
{
    Widget w;
    ...
    return std::move(w);    // 糟糕的设计
}