Bagaimanakah std::move Mengubah Ungkapan kepada Rvalues?
std::move() memudahkan penukaran ungkapan kepada rvalues (kanan rujukan nilai) untuk membolehkan semantik bergerak. Walau bagaimanapun, pelaksanaan dalam perpustakaan standard MSVC boleh membingungkan.
Pelaksanaan adalah seperti berikut:
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); }
Mari kita tunjukkan cara ini berfungsi:
Object obj1; Object obj2 = std::move(obj1); // _Ty&& _Arg binds to obj1
Setelah memanggil std::move(), parameter rujukan _Arg mengikat kepada lvalue obj1. Walau bagaimanapun, memandangkan pengikatan rujukan rvalue kepada lvalue tidak dibenarkan secara langsung, seseorang mungkin menjangkakan hantaran ke rujukan rvalue, seperti (Objek&&), diperlukan.
Mempelajari lebih lanjut tentang pelaksanaan std:: remove_reference menjelaskan perkara:
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; };
Pelaksanaan ini mendedahkan bahawa remove_reference menukar T& kepada T, T&& kepada T, dan T&&& ke dalam T. Oleh itu, untuk kes kami, di mana obj1 ialah lnilai jenis Objek, fungsi yang terhasil menjadi:
Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
Untuk menghuraikan lebih lanjut:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
Pelakon ke Object&& adalah perlu kerana rujukan rnilai yang dinamakan dianggap sebagai lnilai, manakala penukaran tersirat daripada rujukan lnilai kepada rnilai tidak dibenarkan.
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
Di sini, peraturan runtuh rujukan C 11 mula dimainkan dan membenarkan ungkapan Object& && ditafsirkan sebagai Object&, rujukan nilai, yang sememangnya boleh mengikat kepada nilai. Oleh itu, fungsi akhir mengubah hujahnya menjadi rujukan rvalue dan mengembalikannya.
Sebagai kesimpulan, std::move() menggunakan std::remove_reference untuk membolehkan perubahan nilai l dan rvalues kepada rvalues, memudahkan pergerakan semantik dalam C .
Atas ialah kandungan terperinci Bagaimanakah `std::move()` mencapai penukaran lvalues kepada rvalues dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!