以下是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 );
}
答案 0 :(得分:3)
问题不在于移动,而是与T&&
发生的引用崩溃。
关于此here以及这些Q&amp; A here和here的好文章。
我会专注于演员(T&&)
以及为什么不起作用。
鉴于上面列出的参考折叠规则;
T& &
变为T&
T& &&
变为T&
T&& &
变为T&
T&& &&
变为T&&
当T
被推断为左值引用时出现问题,然后T&&
变为T& &&
,崩溃到T&
,给定演员,你只是把它归还到左值参考,你还没有获得能够实现移动的右值参考。
std::remove_reference<T>::type
用于删除所有引用,&&
然后添加rvalue ref,从而确保进行正确的转换。
typename
用于消除成员变量上的成员类型。