Mengapa std::move dinamakan std::move?
Walaupun namanya, std::move(x) tidak secara fizikal gerakkan apa sahaja. Sebaliknya, ia hanyalah hantaran kepada nilai r, dikenali secara khusus sebagai nilai x. Istilah ini berbeza dengan prvalue, yang merujuk kepada ungkapan dengan nilai tetap yang diketahui.
Tujuan konvensyen penamaan ini dengan std::move bukan untuk mengelirukan, sebaliknya untuk meningkatkan kebolehbacaan kod.
Pada asalnya, menghantar nilai l kepada nilai r memerlukan sintaks yang tidak biasa bagi static_cast
template <class T> void swap(T& a, T& b) { T tmp(static_cast<T&&>(a)); a = static_cast<T&&>(b); b = static_cast<T&&>(tmp); }
Dengan menggantikan static_cast dengan std::move, kod menjadi lebih intuitif dan menyampaikan maksud fungsi, iaitu untuk memindahkan nilai daripada menyalinnya:
template <class T> void swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); }
Penggunaan std::move membolehkan pengaturcara dengan jelas lihat bahawa nilai sedang dialihkan, walaupun mereka mungkin tidak memahami sepenuhnya butiran rnilai yang rumit dan memindahkan semantik.
Selain itu, pengaturcara bebas untuk menentukan fungsi atau makro mereka sendiri untuk menghantar nilai kepada nilai jika mereka lebih suka . Sebagai contoh, coretan kod berikut melaksanakan fungsi std::move menggunakan nama set_value_category_to_xvalue:
template <class T> inline constexpr auto& set_value_category_to_xvalue(T&& t) noexcept { return static_cast<std::remove_reference_t<T>&>(t); }
Akhirnya, manakala kod objek yang dijana untuk std::move tidak melibatkan sebarang pergerakan sebenar, ia memainkan peranan penting semasa penyusunan. Ia mengubah lebihan fungsi yang dipanggil, yang berpotensi membawa kepada penggunaan pengendali tugasan pergerakan yang lebih cekap yang ditakrifkan dalam kelas.
Atas ialah kandungan terperinci Mengapa std::move dipanggil std::move jika ia sebenarnya tidak menggerakkan apa-apa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!