_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;
}
Я предполагаю, что все дело в правилах сворачивания ссылок и вычитания аргументов шаблона, но я в замешательстве. Мое любопытство по этому поводу должно быть разрушено, чтобы я мог спать спокойно.
Заранее спасибо.