Ich habe gerade festgestellt, dass ich die Logik von nicht vollständig verstanden habe std::move()
.
Zuerst habe ich es gegoogelt, aber es scheint nur Dokumente zu geben, wie man es benutzt std::move()
, nicht wie seine Struktur funktioniert.
Ich meine, ich weiß, was die Vorlagenelementfunktion ist, aber wenn ich mir die std::move()
Definition in VS2010 anschaue, ist sie immer noch verwirrend.
Die Definition von std :: move () ist unten aufgeführt.
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);
}
Was mir zuerst komisch ist, ist der Parameter (_Ty && _Arg), denn wenn ich die Funktion aufrufe, wie Sie unten sehen,
// main()
Object obj1;
Object obj2 = std::move(obj1);
es ist im Grunde gleich
// std::move()
_Ty&& _Arg = Obj1;
Aber wie Sie bereits wissen, können Sie einen LValue nicht direkt mit einer RValue-Referenz verknüpfen, weshalb ich denke, dass dies so sein sollte.
_Ty&& _Arg = (Object&&)obj1;
Dies ist jedoch absurd, da std :: move () für alle Werte funktionieren muss.
Um zu verstehen, wie das funktioniert, sollte ich mir auch diese Strukturen ansehen.
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;
};
Leider ist es immer noch so verwirrend und ich verstehe es nicht.
Ich weiß, dass dies alles auf meinen Mangel an grundlegenden Syntaxkenntnissen in C ++ zurückzuführen ist. Ich würde gerne wissen, wie diese gründlich funktionieren, und alle Dokumente, die ich im Internet erhalten kann, werden mehr als begrüßt. (Wenn Sie dies nur erklären können, wird das auch fantastisch sein).
move
funktioniert und nicht wie es implementiert wird. Ich finde diese Erklärung wirklich nützlich: pagefault.blog/2018/03/01/… .