Почему std::move() не работает без _Remove_reference?

_Remove_reference существует для, как вы знаете, преобразования T& в T или T&& в T.

Я сделал следующий код в игривом настроении, он не работает совсем не так, как я ожидал, но понятия не имею почему.

template<class _Ty>
struct _Remove_reference
{   // remove reference
    typedef _Ty _Type;
    static void func(){ cout << "1" << endl; } 
};

// template<class _Ty>
// struct _Remove_reference<_Ty&>
// {    // remove reference
//  typedef _Ty _Type;
//  static void func(){ cout << "2" << endl; }
// };
// 
// template<class _Ty>
// struct _Remove_reference<_Ty&&>
// {    // remove rvalue reference
//  typedef _Ty _Type;
//  static void func(){ cout << "3" << endl; }
// };

template<class _Ty> inline
    typename _Remove_reference<_Ty>::_Type&&
    move(_Ty&& _Arg)
{   // forward _Arg as movable
    typename _Remove_reference<_Ty>::func();
    return ((typename _Remove_reference<_Ty>::_Type&&)_Arg);
}

int main(){
    int a1= 3;
    int&& a2 = move(a1); // can't convert the a1 to int&&
    return 0;
}

Я предполагаю, что все дело в правилах сворачивания ссылок и вычитания аргументов шаблона, но я в замешательстве. Мое любопытство по этому поводу должно быть разрушено, чтобы я мог спать спокойно.

Заранее спасибо.

5
задан R. Martinho Fernandes 29 November 2011 в 13:22
поделиться