无法理解 std::move 的实现

Can't understand the implementation of std::move

本文关键字:move 实现 std      更新时间:2023-10-16

这是std::move()的可能实现。它不完全符合标准的细节,但它非常接近:

template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{   
    return ( ( typename std::remove_reference<T>::type&& )Arg );
}

我不明白为什么如果我们用T&&替换typename std::remove_reference<T>::type&&不起作用,即

template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{   
    return ( (T&&) Arg );
}

问题实际上不在于移动,而在于T&&发生的引用崩溃。

关于这个的好文章,这里和这里的问答。

我将重点介绍演员(T&&)以及为什么这不起作用。

鉴于上面列出的参考折叠规则;

  • T& &变得T&
  • T& &&变得T&
  • T&& &变得T&
  • T&& &&变得T&&

T被推导出为左值引用时,问题就出现了,然后T&&变得T& &&折叠为T&,给定强制转换,您只是将其投射回左值引用,并且您没有获得使移动发生

std::remove_reference<T>::type用于删除所有引用,然后&&添加回右值引用,从而确保进行正确的转换。

typename用于消除成员变量上的成员类型的歧义。