Mengapa std::move dipanggil std::move jika ia sebenarnya tidak menggerakkan apa-apa?

DDD
Lepaskan: 2024-11-14 19:09:02
asal
532 orang telah melayarinya

Why is std::move called std::move if it doesn't actually move anything?

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(a). Coretan kod ini menunjukkan cara menukar dua nilai menggunakan kaedah ini:

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);
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan