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

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-14 14:46:02437semak imbas

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); }

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); }

Sejak remove_reference menukarkan Object kepada Object, kita berakhir dengan:

Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }

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);

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); }

Sekali lagi, remove_reference

Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }

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); }

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:
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