Me encontré sin comprender completamente la lógica de std::move()
.
Al principio, lo busqué en Google, pero parece que solo hay documentos sobre cómo usar std::move()
, no cómo funciona su estructura.
Quiero decir, sé cuál es la función del miembro de la plantilla, pero cuando miro std::move()
definición en VS2010, todavía es confuso.
la definición de std :: move () va más abajo.
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);
}
Lo que es extraño primero para mí es el parámetro, (_Ty && _Arg), porque cuando llamo a la función como ves a continuación,
// main()
Object obj1;
Object obj2 = std::move(obj1);
Básicamente equivale a
// std::move()
_Ty&& _Arg = Obj1;
Pero como ya sabes, no puedes vincular directamente un LValue a una referencia de RValue, lo que me hace pensar que debería ser así.
_Ty&& _Arg = (Object&&)obj1;
Sin embargo, esto es absurdo porque std :: move () debe funcionar para todos los valores.
Así que supongo que para entender completamente cómo funciona esto, debería echar un vistazo a estas estructuras también.
template<class _Ty>
struct _Remove_reference
{ // remove reference
typedef _Ty _Type;
};
template<class _Ty>
struct _Remove_reference<_Ty&>
{ // remove reference
typedef _Ty _Type;
};
template<class _Ty>
struct _Remove_reference<_Ty&&>
{ // remove rvalue reference
typedef _Ty _Type;
};
Desafortunadamente, sigue siendo tan confuso y no lo entiendo.
Sé que todo esto se debe a mi falta de conocimientos básicos de sintaxis sobre C ++. Me gustaría saber cómo funcionan a fondo y cualquier documento que pueda obtener en Internet será más que bienvenido. (Si puedes explicar esto, también será genial).
move
funciona en lugar de cómo se implementa. Encuentro esta explicación realmente útil: pagefault.blog/2018/03/01/… .