std::move vs. std::forward: Membongkar Perbezaan untuk Pengendalian Nilai
Kemunculan semantik move dalam C telah diperkenalkan dua fungsi penting untuk memanipulasi dan memindahkan rujukan nilai: std::move and std:: hadapan. Walaupun kedua-duanya menghantar objek kepada jenis rujukan, mereka menyimpang dalam gelagat dan kes penggunaan khusus mereka.
std::move: Menghantar ke Rujukan Rvalue
std:: bergerak mengambil objek dan menukarnya menjadi rujukan rnilai. Ini penting kerana rujukan nilai biasanya membayangkan bahawa objek yang dirujuk boleh dianggap sementara dan berpotensi tidak sah selepas penggunaan. Pada dasarnya, std::move membolehkan anda memberi isyarat bahawa anda berhasrat untuk "menggerakkan" objek dari lokasi semasanya, yang berpotensi membebaskan memori asas yang didudukinya.
std::forward: Perfect Forwarding Rujukan Rvalue
std::forward, sebaliknya, berfungsi untuk tujuan tertentu: ia memastikan bahawa fungsi memajukan jenis rujukan argumen kepada pemanggil. Ini membolehkan "pemajuan sempurna", yang bermaksud bahawa argumen rnilai yang dihantar kepada fungsi akan terus dianggap sebagai nilai dalam fungsi tersebut. Ini penting untuk mengekalkan semantik yang dimaksudkan bagi nilai sementara ini.
Bila Menggunakan Mana
Memutuskan antara std::move dan std::forward bergantung pada konteks dan hasil yang diingini:
Untuk menggambarkan perbezaan, pertimbangkan contoh berikut:
void overload(int const& arg) { std::cout << "by lvalue\n"; } void overload(int&& arg) { std::cout << "by rvalue\n"; } template<typename t> void forwarding(t&& arg) { std::cout << "via std::forward: "; overload(std::forward<t>(arg)); std::cout << "via std::move: "; overload(std::move(arg)); std::cout << "by simple passing: "; overload(arg); }
Apabila memanggil pemajuan(5) dengan nilai r, outputnya ialah:
via std::forward: by rvalue via std::move: by rvalue by simple passing: by rvalue
Ini menunjukkan bahawa std::forward mengekalkan sifat rnilai hujah, manakala std::move menganggapnya sebagai rvalue dan berpotensi membatalkannya.
Sebaliknya, memanggil forwarding(x) dengan lvalue (x = 5) menghasilkan:
via std::forward: by lvalue via std::move: by rvalue by simple passing: by lvalue
Di sini, kedua-dua std::forward dan std:: pindahkan nilai l kepada rujukan nilai, menyerlahkan peranan mereka yang berbeza.
Atas ialah kandungan terperinci std::move vs. std::forward: Bilakah Anda Harus Menggunakan Setiap untuk Pengendalian Nilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!