在VS10的STL实现中,对于std :: swap()的变体,有以下代码:
// TEMPLATE FUNCTION _Move
template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&&
_Move(_Ty&& _Arg)
{ // forward _Arg as movable
return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg);
}
// TEMPLATE FUNCTION swap (from <algorithm>)
template<class _Ty> inline
void swap(_Ty& _Left, _Ty& _Right)
{ // exchange values stored at _Left and _Right
_Ty _Tmp = _Move(_Left);
_Left = _Move(_Right);
_Right = _Move(_Tmp);
}
_Move()中对(typename tr1::_Remove_reference<_Ty>::_Type&&)
的强制转换是我问题的来源。
在此上下文中,_Remove_reference
定义如下:
// TEMPLATE _Remove_reference
template<class _Ty>
struct _Remove_reference
{ // remove reference
typedef _Ty _Type;
};
_Remove_reference做了什么,为什么? 此外,什么和&amp;&amp;在这里,它是如何被称为?
答案 0 :(得分:3)
_Remove_reference
是一个模板,它可以从其类型中删除引用。我非常确定该模板专门针对T&
和T&&
使用相同的typedef
,对吗?
不知道我应该在这里详细说明多少。你熟悉模板元编程吗?
_Move
似乎正是std::move
所做的:它将其参数转换为右值。练习的重点是std::swap
可以做移动而不是复制。您熟悉move semantics吗?
什么&amp;&amp;在这里,它是如何被称为?
您正在寻找的术语是“右值参考”。观看this video并回答问题。
答案 1 :(得分:1)
这是C ++ 0x右值引用的一部分。模板move
所做的是将引用转换为右值引用,以便可以使用移动语义实现swap
(如果类型支持移动,则不会生成副本
_Remove_reference
看起来像一个模板,用于从可能拥有它的类型中提取没有引用的类型。
template <typename T> struct remove_ref { typedef T type; };
template <typename T> struct remove_ref<T&> { typedef T type; };