Здравствуйте, rus blood, Вы писали:
RB>У меня нет 2008-й, и ты не привел полный список параметров, но по коду 2005-й,
RB>RB>template<class _InIt, class _FwdIt, class _Alloc>
RB>inline _FwdIt _Uninit_move(
RB>
RB>соответствует версии _Uninit_move для типов с поддержкой _Swap_move_tag.
RB>Категория move определяется выше по стеку вызовов, и задается явным перечислением типов.
да, действительно, так и есть есть
template<class _InIt, class _FwdIt, class _Alloc>
inline
_FwdIt _Uninit_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
_Alloc& _Al, _Swap_move_tag, _Range_checked_iterator_tag)
её реализация требует наличия конструктора по умолчанию для элементов последовательности.
а у _Swap_move_tag ноги растут отсюда:
<xutulity>
template<class _Ty>
struct _Is_swap_move
{ // assumes _Ty is not _Swap_move_tag
static const bool _Value = false;
};
template<>
struct _Is_swap_move<_Swap_move_tag>
{ // reports true for _Swap_move_tag
static const bool _Value = true;
};
template<class _Ty1,
class _Ty2>
class _Move_operation_category<pair<_Ty1, _Ty2> >
{ // reports true if either member of pair is _Swap_move_tag
public:
typedef typename _If<
_Is_swap_move<typename _Move_operation_category<
_Ty1>::_Move_cat>::_Value || /// false для класс A
_Is_swap_move<typename _Move_operation_category<
_Ty2>::_Move_cat>::_Value, /// true для vector< int > (смотри на _Move_operation_category для вектора)
_Swap_move_tag,
_Undefined_move_tag>::_Result _Move_cat; /// получаем _Swap_move_tag, что выглядит несколько странно.
};
<vector>
// vector implements a performant swap
template <class _Ty, class _Ax>
class _Move_operation_category<vector<_Ty, _Ax> >
{
public:
typedef _Swap_move_tag _Move_cat;
};
Вот такие пироги.
Похоже, что пирожок был испечён SP1 для VS2008