Я просто обнаружил, что не до конца понимаю логику std::move()
.
Сначала я погуглил, но похоже, что есть только документы о том, как использовать std::move()
, а не о том , как работает его структура.
Я имею в виду, что я знаю, что такое функция-член шаблона, но когда я смотрю на std::move()
определение в VS2010, это все еще сбивает с толку.
определение std :: move () приведено ниже.
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);
}
В первую очередь мне кажется странным параметр (_Ty && _Arg), потому что, когда я вызываю функцию, как вы видите ниже,
// main()
Object obj1;
Object obj2 = std::move(obj1);
это в основном равно
// std::move()
_Ty&& _Arg = Obj1;
Но, как вы уже знаете, вы не можете напрямую связать LValue со ссылкой на RValue, что заставляет меня думать, что это должно быть так.
_Ty&& _Arg = (Object&&)obj1;
Однако это абсурд, потому что std :: move () должен работать для всех значений.
Итак, я думаю, чтобы полностью понять, как это работает, я должен также взглянуть на эти структуры.
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;
};
К сожалению, это все еще сбивает с толку, и я этого не понимаю.
Я знаю, что это все из-за отсутствия у меня базовых навыков синтаксиса в C ++. Я хотел бы знать, как они работают, и любые документы, которые я могу найти в Интернете, будут более чем приветствоваться. (Если вы можете просто объяснить это, это тоже будет круто).