无法理解 std::move 的实现

Dav*_*vid 3 c++ move-semantics

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

template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{   
    return ( ( typename std::remove_reference<T>::type&& )Arg );
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这是行不通的,如果我们更换typename std::remove_reference<T>::type&&T&&,即

template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{   
    return ( (T&&) Arg );
}
Run Code Online (Sandbox Code Playgroud)

Nia*_*all 5

问题实际上不在于移动,而在于T&&.

该是这个漂亮的写起坐这里和这些Q&A在这里,并在这里

我将专注于演员(T&&)以及为什么这不起作用。

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

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

T被推导为左值引用时,问题就出现了,然后T&&变成T& &&了 折叠T&,给定转换,您只是将其转换回左值引用,而您还没有获得能够发生移动的右值引用。

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

typename是有消歧超过一个成员变量的成员类型。