move移动主要目的是把左值引用转为右值引用,move的一种实现为:
template<class T>
typename remove_reference<T>::type&& std::move(T&& a) noexcept
{
typedef typename remove_reference<T>::type&& RvalRef;
return static_cast<RvalRef>(a);
}
move之所以能够实现这种,是因为引用折叠规则:
A& + A& = A&
A& + A&& = A&
A&& + A& = A&
A&& + A&& = A&&
总之不管参数是左值引用还是右值引用,最后返回的都是右值引用。
参考资料:
https://blog.csdn.net/p942005405/article/details/84644069
https://www.cnblogs.com/taiyang-li/p/5894607.html