了解std :: swap()。 tr1 :: _ Remove_reference的目的是什么?

时间:2011-01-27 19:05:05

标签: c++ visual-studio-2010 stl

在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;在这里,它是如何被称为?

2 个答案:

答案 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; };