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