Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah std::move() Mengendalikan Lvalues ​​dalam C ?

Bagaimanakah std::move() Mengendalikan Lvalues ​​dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-11-14 14:46:02
asal
436 orang telah melayarinya

How Does std::move() Handle Lvalues in C  ?

Apakah yang std::move() Lakukan kepada lvalues?

std::move() ialah alat yang berkuasa dalam C untuk memudahkan pemajuan yang sempurna. Namun pelaksanaannya boleh menaikkan sedikit kening apabila dilihat pertama kali. Untuk menjelaskan cara std::move() mencapai ini, mari kita mendalami selok-belok pelaksanaannya.

Memahami Fungsi 'Move'

Kita akan mulakan dengan versi ringkas bagi fungsi 'move' templat:

template <typename T>
typename remove_reference<T>::type&& move(T&& arg)
{ return static_cast<typename remove_reference<T>::type&&>(arg); }
Salin selepas log masuk

Kes 1: Melepasi Nilai R

Apabila std::move() dipanggil dengan nilai r (objek sementara atau ungkapan yang menilai kepada nilai r), templat alih diwujudkan seperti berikut:

// move with [T = Object]:
remove_reference<Object>::type&& move(Object&& arg)
{ return static_cast<remove_reference<Object>::type&&>(arg); }
Salin selepas log masuk

Sejak remove_reference menukarkan Object kepada Object, kita berakhir dengan:

Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
Salin selepas log masuk

Seperti yang dijangkakan, fungsi hanya menghantar argumen rvaluenya kepada rujukan rvalue.

Kes 2: Melepasi Nilai L

Kini, kes yang menarik timbul apabila std::move() ialah digunakan dengan lvalue (pembolehubah bernama atau ungkapan yang menilai kepada lvalue).

Object a; // a is lvalue
Object b = std::move(a);
Salin selepas log masuk

Kali ini, templat alihan dipohon kepada:

// move with [T = Object&]
remove_reference<Object&>::type&& move(Object& && arg)
{ return static_cast<remove_reference<Object&>::type&&>(arg); }
Salin selepas log masuk

Sekali lagi, remove_reference

Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
Salin selepas log masuk

Pada pandangan pertama, ini kelihatan berlawanan dengan intuitif kerana kami telah melepasi nilai. Walau bagaimanapun, C 11 memperkenalkan konsep rujukan runtuh, yang mengubah suai tafsiran sintaks rujukan:

  • Objek & & = Objek &
  • Objek & & && = Objek &
  • Objek & && & = Objek &
  • Objek & && & && = Objek & &&

Di bawah peraturan ini, Object& && berkesan berkelakuan sebagai Object&, rujukan nilai biasa yang boleh mengikat nilai.

Oleh itu, bentuk akhir fungsi menjadi:

Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
Salin selepas log masuk

Dalam essence, std::move() menghantar hujah lvalue kepada rujukan rvalue, membolehkan pemajuan sempurna tanpa mengira jenis input.

Atas ialah kandungan terperinci Bagaimanakah std::move() Mengendalikan Lvalues ​​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