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

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

我不明白为什么如果我们用typename std::remove_reference<T>::type&&替换T&&,即为什么不起作用,即
template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{
    return ( (T&&) Arg );
}

最佳答案

问题并不是真正的问题,而是T&&导致的引用崩溃。

关于此here以及这些Q&A herehere的不错的文章。

我将重点介绍强制转换的(T&&)以及为什么它不起作用。

给定上面列出的引用折叠规则;

  • T& &变成T&
  • T& &&变成T&
  • T&& &变成T&
  • T&& &&变成T&&

  • 当将T推导为左值引用时,就会出现问题,然后T&&变成T& &&,它折叠为T&,如果进行了强制转换,则仅将其转换回左值引用,而没有获得使移动发生的右值引用。

    那里的std::remove_reference<T>::type会删除所有引用,然后&&再添加右值ref,从而确保进行正确的转换。
    typename可以消除成员变量对成员类型的歧义。

    09-07 06:57