无法理解std :: move

时间:2016-03-10 07:53:52

标签: 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 );
}

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

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

1 个答案:

答案 0 :(得分:3)

问题不在于移动,而是与T&&发生的引用崩溃。

关于此here以及这些Q&amp; A herehere的好文章。

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

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

  • T& &变为T&
  • T& &&变为T&
  • T&& &变为T&
  • T&& &&变为T&&

T被推断为左值引用时出现问题,然后T&&变为T& &&,崩溃到T&,给定演员,你只是把它归还到左值参考,你还没有获得能够实现移动的右值参考。

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

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