Я просто виявив, що не повністю розумію логіку 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 ++. Мені хотілося б знати, як вони ретельно працюють і будь-які документи, які я можу отримати в Інтернеті, будуть більш ніж вітані. (Якщо ви можете просто пояснити це, це теж буде приголомшливо).
move
працює, а не як це реалізовано. Я вважаю це пояснення дуже корисним: pagefault.blog/2018/03/01/… .