Je me suis juste retrouvé à ne pas comprendre pleinement la logique de std::move()
.
Au début, je l'ai recherché sur Google, mais il semble qu'il n'y ait que des documents sur la façon de l'utiliser std::move()
, pas sur le fonctionnement de sa structure.
Je veux dire, je sais ce qu'est la fonction de membre du modèle, mais quand je regarde la std::move()
définition dans VS2010, cela reste déroutant.
la définition de std :: move () va ci-dessous.
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);
}
Ce qui m'est étrange en premier, c'est le paramètre (_Ty && _Arg), car lorsque j'appelle la fonction comme vous le voyez ci-dessous,
// main()
Object obj1;
Object obj2 = std::move(obj1);
cela équivaut fondamentalement à
// std::move()
_Ty&& _Arg = Obj1;
Mais comme vous le savez déjà, vous ne pouvez pas directement lier une LValue à une référence RValue, ce qui me fait penser qu'il devrait en être ainsi.
_Ty&& _Arg = (Object&&)obj1;
Cependant, c'est absurde car std :: move () doit fonctionner pour toutes les valeurs.
Donc, je suppose que pour bien comprendre comment cela fonctionne, je devrais également jeter un coup d'œil à ces structures.
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;
};
Malheureusement, c'est toujours aussi déroutant et je ne comprends pas.
Je sais que tout cela est dû à mon manque de compétences de base en syntaxe sur C ++. J'aimerais savoir comment ils fonctionnent à fond et tous les documents que je peux obtenir sur Internet seront plus que bienvenus. (Si vous pouvez simplement expliquer cela, ce sera génial aussi).
move
fonctionne plutôt que comment il est mis en œuvre. Je trouve cette explication vraiment utile: pagefault.blog/2018/03/01/… .