Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `std::move()` menukar ungkapan kepada rvalues dalam C ?
std::move() dan Penukaran Ungkapan kepada Rvalues
std::move() ialah fungsi berkuasa dalam C yang membolehkan anda memindahkan objek dari satu lokasi ke lokasi lain tanpa menyalinnya. Memahami pelaksanaannya boleh menjadi mencabar, tetapi penting untuk mengetahui keupayaannya.
Butiran Pelaksanaan
Pelaksanaan std::move() dalam perpustakaan standard MSVC menggunakan templat std::remove_reference untuk menukar ungkapan kepada nilai r. Begini cara ia berfungsi:
template<class _Ty> inline typename tr1::_Remove_reference< _Ty >:: _Type& && move( _Ty && _Arg ) { return ((typename tr1::_Remove_reference< _Ty >:: _Type&&) _Arg); }
Mengikat kepada Lvalues
Apabila anda menghantar lvalue kepada std::move(), parameter rujukan _Arg mengikat kepada lvalue . Walau bagaimanapun, anda tidak boleh secara langsung mengikat rujukan rnilai kepada lnilai. Untuk menyelesaikan masalah ini, pelaksanaan menghantar lvalue ke rujukan rvalue menggunakan std::static_cast.
Memahami std::remove_reference
std::remove_reference digunakan untuk mengalih keluar rujukan daripada jenis. Berikut ialah pelaksanaannya:
template<class _Ty> struct _Remove_reference { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty && > { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty &&&&> { typedef _Ty _Type };
Penggunaan dengan Rvalues
Apabila std::move() dipanggil dengan rvalue, std::remove_reference menukarkan T&& kepada T, menghasilkan instantiasi templat fungsi berikut:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
Pelakon diperlukan kerana rujukan rvalue bernama dianggap sebagai lvalues.
Penggunaan dengan Lvalues
Apabila std::move() dipanggil dengan lvalue, std::remove_reference menukarkan T& to T, menghasilkan templat fungsi berikut instantiation:
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
Peraturan keruntuhan rujukan yang disediakan oleh standard C 11 membenarkan Object& && untuk mengikat kepada lnilai. Fungsi yang terhasil secara berkesan menghantar hujah lvalue kepada rujukan rvalue.
Kesimpulan
std::move() memanfaatkan std::remove_reference dan peraturan runtuh rujukan untuk membenarkan penukaran kedua-dua nilai dan nilai kepada rujukan nilai. Ini membolehkan pergerakan objek yang cekap dan pengoptimuman penggunaan memori.
Atas ialah kandungan terperinci Bagaimanakah `std::move()` menukar ungkapan kepada rvalues dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!