Po prostu stwierdziłem, że nie w pełni rozumiem logikę std::move()
.
Na początku wyszukałem go w Google, ale wydaje się, że są tylko dokumenty o tym, jak używać std::move()
, a nie o tym , jak działa jego struktura.
Chodzi mi o to, że wiem, jaka jest funkcja elementu członkowskiego szablonu, ale kiedy patrzę na std::move()
definicję w VS2010, nadal jest myląca.
definicja std :: move () znajduje się poniżej.
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);
}
Przede wszystkim dziwny jest dla mnie parametr (_Ty && _Arg), ponieważ kiedy wywołuję funkcję, jak widać poniżej,
// main()
Object obj1;
Object obj2 = std::move(obj1);
w zasadzie równa się
// std::move()
_Ty&& _Arg = Obj1;
Ale jak już wiesz, nie można bezpośrednio powiązać LValue z odniesieniem RValue, co sprawia, że myślę, że powinno tak być.
_Ty&& _Arg = (Object&&)obj1;
Jest to jednak absurdalne, ponieważ std :: move () musi działać dla wszystkich wartości.
Więc myślę, że aby w pełni zrozumieć, jak to działa, powinienem również przyjrzeć się tym strukturom.
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;
};
Niestety nadal jest to zagmatwane i nie rozumiem.
Wiem, że to wszystko z powodu mojego braku podstawowych umiejętności składniowych w C ++. Chciałbym wiedzieć, jak dokładnie działają, a wszelkie dokumenty, które mogę znaleźć w Internecie, będą mile widziane. (Jeśli możesz to tylko wyjaśnić, to też będzie niesamowite).