Saya baru saja menemukan diri saya tidak sepenuhnya memahami logika std::move()
.
Awalnya saya googling di Google tapi sepertinya hanya ada dokumen tentang cara penggunaan std::move()
, bukan cara kerja strukturnya.
Maksud saya, saya tahu apa itu fungsi anggota template tetapi ketika saya melihat std::move()
definisi di VS2010, itu masih membingungkan.
definisi dari std :: move () di bawah ini.
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);
}
Yang aneh pertama kali bagi saya adalah parameternya, (_Ty && _Arg), karena ketika saya memanggil fungsi seperti yang Anda lihat di bawah,
// main()
Object obj1;
Object obj2 = std::move(obj1);
itu pada dasarnya sama dengan
// std::move()
_Ty&& _Arg = Obj1;
Tetapi seperti yang telah Anda ketahui, Anda tidak dapat langsung menautkan LValue ke referensi RValue, yang membuat saya berpikir seharusnya seperti ini.
_Ty&& _Arg = (Object&&)obj1;
Namun, ini tidak masuk akal karena std :: move () harus berfungsi untuk semua nilai.
Jadi saya kira untuk sepenuhnya memahami cara kerjanya, saya harus melihat struct ini juga.
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;
};
Sayangnya itu masih membingungkan dan saya tidak mengerti.
Saya tahu bahwa ini semua karena saya kurang memiliki keterampilan sintaks dasar tentang C ++. Saya ingin tahu bagaimana ini bekerja secara menyeluruh dan dokumen apa pun yang bisa saya dapatkan di internet akan disambut dengan sangat baik. (Jika Anda bisa menjelaskan ini, itu akan luar biasa juga).
move
kerjanya daripada bagaimana penerapannya. Saya menemukan penjelasan ini sangat berguna: pagefault.blog/2018/03/01/… .