Mi sono appena trovato a non comprendere appieno la logica di std::move()
.In che modo std :: move() trasferisce i valori in RValues?
All'inizio, ho cercato su Google ma sembra che ci siano solo documenti su come utilizzare std::move()
, non su come funziona la sua struttura.
Voglio dire, so qual è la funzione membro del modello, ma quando guardo nella definizione std::move()
in VS2010, è ancora confusa.
la definizione di std :: move() è riportata di seguito.
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);
}
Qual è strano prima per me è il parametro, (_Ty & & _Arg), perché quando io chiamo la funzione di come si vede qui sotto,
// main()
Object obj1;
Object obj2 = std::move(obj1);
è uguale fondamentalmente per
// std::move()
_Ty&& _Arg = Obj1;
Ma come già sapete, non è possibile collegare direttamente un LValue a un riferimento RValue, il che mi fa pensare che dovrebbe essere così.
_Ty&& _Arg = (Object&&)obj1;
Tuttavia, questo è assurdo perché std :: move() deve funzionare per tutti i valori.
Quindi, per capire a fondo come funziona, dovrei dare un'occhiata anche a queste strutture.
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;
};
Sfortunatamente è ancora così confuso e non capisco.
So che questo è tutto a causa della mia mancanza di competenze di sintassi di base su C++. Mi piacerebbe sapere come funzionano a fondo e tutti i documenti che posso ottenere su Internet saranno più che graditi. (Se puoi semplicemente spiegare questo, sarà fantastico).
"So che questo è tutto a causa della mia mancanza di competenze di sintassi di base su C++." Allora non sei pronto per sapere come funziona. Tutto quello che devi sapere è come scrivere un costruttore di mosse, e quando e come usare 'std :: move' quando vuoi spostare costruire qualcosa. I dettagli di questo processo, la "magia profonda" che C++ 11 usava per far funzionare questo processo, non sono qualcosa di cui devi preoccuparti. Semplicemente non hai le basi della conoscenza per capire le particolari interazioni di funzionalità che fanno funzionare tutto. –
Cosa disse Nicol Bolas. Se conosci te stesso che ti mancano le abilità di base, questo è il problema che devi risolvere prima, non la tua incapacità di capire std :: move! –
@NicolBolas Al contrario, la domanda stessa mostra che l'OP si sta sottomettendo in quella dichiarazione. È proprio OP * afferrare * le abilità di sintassi di base che consente loro di porre anche la domanda. –