Merungkai Misteri Sihir Penukaran std::move
Apabila menggunakan std::move(), adalah membingungkan untuk melihat bahawa yang dirujuk parameter rvalue boleh terikat kepada lvalues, yang biasanya dihadkan daripada melekat pada rujukan rvalue. Menyelidiki pelaksanaan std::move() mendedahkan kunci kepada paradoks yang jelas ini.
Membedah Pelaksanaan std::move()
Bermula dengan yang diperhalusi versi std::move():
template <typename T> typename remove_reference<T>::type&& move(T&& arg) { return static_cast<typename remove_reference<T>::type&&>(arg); }
Kes 1: Menyebut move() dengan Rvalues
Apabila move() digunakan dengan rvalues, seperti objek sementara:
Object a = std::move(Object()); // Object() is temporary, hence prvalue
Instasiasi templat yang terhasil ialah:
remove_reference<Object>::type&& move(Object&& arg) { return static_cast<remove_reference<Object>::type&&>(arg); }
Memandangkan remove_reference mengubah T& menjadi T atau T&& kepada T dan Objek ialah nilai biasa, morfologi fungsi terakhir menjadi:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
Pelakon adalah penting kerana rujukan nilai yang dinamakan dianggap sebagai nilai l.
Kes 2: Mendapatkan langkah() dengan Lnilai
Apabila move() digunakan dengan lvalues:
Object a; // a is an lvalue Object b = std::move(a);
Instasiasi move() yang terhasil ialah:
remove_reference<Object&>::type&& move(Object& && arg) { return static_cast<remove_reference<Object&>::type&&>(arg); }
Sekali lagi, remove_reference menterjemah Object& kepada Object, menghasilkan:
Object&& move(Object& && arg) { return static_cast