В STL-реализации VS10 есть следующий код для варианта 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);
}
Приведение к (typename tr1::_Remove_reference<_Ty>::_Type&&)
в _Move () является источником моего вопроса.
В этом контексте _Remove_reference
определяется следующим образом:
// TEMPLATE _Remove_reference
template<class _Ty>
struct _Remove_reference
{ // remove reference
typedef _Ty _Type;
};
Что делает _Remove_reference и почему?
Кроме того, что здесь делает и как это называется?