std::move()实施的是无条件的向右值型别进行强制类型转换,而std::forward仅当实参是右值时,才会将参数转换为右值,且它们都仅仅时强制类型转换,并不做移动操作。

 std::move()的使用场景没有什么好说的了,当你需要实参是右值时,执行该函数就对了,因为它可以百分百返回参数对应的右值。关于std::forward的使用场景,我们直接来看代码:

void process(const Widget& lValue);  //处理左值
void process(const Widget&& rValue); //处理右值


template <class T>
//param是万能引用,可以接受左值,也可以接受右值
//且无论实参是何类型,只要传入到函数都为左值,因为可以取地址
void logAndProcess(T&& param) {
    //dosomething
    //std::forward将判断w如果是左值,将什么都不做,如果是右值,则返回一个右值
    //完成完美转发
    process(std::forward<T>(param));
};

Widget w;
logAndProcess(w);           //传入左值
logAndProcess(std::move(w));//传入右值
logAndProcess(std::move(w));//传入右值

另外有一点与本章无关的点需要注意,建议不要对常量执行移动操作,因为如果该类的移动操作接受的参数是非const类型的,那么即使入参是右值,也会一声不响的改调用该类的复制构造函数。