Понимание std :: swap ().Какова цель tr1 :: _ Remove_reference? - PullRequest
2 голосов
/ 27 января 2011

В 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 и почему? Кроме того, что здесь делает и как это называется?

Ответы [ 2 ]

3 голосов
/ 27 января 2011

_Remove_reference - это шаблон, который удаляет ссылку из ее типа.Я почти уверен, что шаблон специализирован для T& и T&& с одинаковыми typedef, верно?

Не уверен, сколько мне стоит вдаваться в детали.Вы знакомы с метапрограммированием шаблонов?

_Move, кажется, делает именно то, что делает std::move: он приводит свой аргумент к r-значению.Суть упражнения в том, что std::swap может делать ходы вместо копий.Вы знакомы с семантикой перемещения ?

что здесь и как здесь происходит и как это называется?

Вы ищете термин"ссылка на значение".Посмотрите это видео и возвращайтесь с вопросами.

1 голос
/ 27 января 2011

Это часть C ++ 0x rvalue ссылок.Шаблон move выполняет преобразование ссылки в rvalue-ссылку, так что swap может быть реализовано с семантикой перемещения (копии не создаются, если тип поддерживает moving .

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

template <typename T> struct remove_ref { typedef T type; };
template <typename T> struct remove_ref<T&> { typedef T type; };
*1011*
...