这是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 here和here的不错的文章。
我将重点介绍强制转换的(T&&)
以及为什么它不起作用。
给定上面列出的引用折叠规则;
T& &
变成T&
T& &&
变成T&
T&& &
变成T&
T&& &&
变成T&&
当将
T
推导为左值引用时,就会出现问题,然后T&&
变成T& &&
,它折叠为T&
,如果进行了强制转换,则仅将其转换回左值引用,而没有获得使移动发生的右值引用。那里的
std::remove_reference<T>::type
会删除所有引用,然后&&
再添加右值ref,从而确保进行正确的转换。typename
可以消除成员变量对成员类型的歧义。