Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah `std::move()` menukar ungkapan kepada rvalues ​​dalam C ?

Bagaimanakah `std::move()` menukar ungkapan kepada rvalues ​​dalam C ?

Susan Sarandon
Lepaskan: 2024-11-28 03:22:11
asal
790 orang telah melayarinya

How does `std::move()` convert expressions to rvalues in 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);
}
Salin selepas log masuk

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 };
Salin selepas log masuk

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);
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan