Memahami std::forward: Peranannya dalam Melepasi Rujukan Nilai L dan R
std::forward ialah alat berkuasa dalam C untuk sempurna memajukan hujah, memastikan tingkah laku kod yang optimum tanpa mengira sama ada rujukan nilai atau nilai berlalu.
Intuisi Nilai lwn. Nilai
Salah tanggapan bahawa "jika ia mempunyai nama, ia adalah nilai" boleh mengelirukan. Walaupun pembolehubah secara amnya memegang nilai l, perbezaan ini lebih kepada konteks dan operasi yang terlibat.
Keperluan untuk Pemajuan Sempurna
Pertimbangkan set fungsi yang menyimpan vektor v dalam struktur datanya _v. Pendekatan selamat adalah dengan mengambil rujukan kepada v dalam set, tetapi ini mungkin mengakibatkan salinan yang tidak diperlukan apabila v ialah nilai r, seperti dalam contoh di bawah:
set(makeAndFillVector()); // Copies `makeAndFillVector()`'s result into `_v`
Pemajuan yang sempurna menjadi perlu untuk mengekalkan nilai r sifat v dan elakkan penyalinan yang tidak perlu.
std::forward's Peranan
std::forward memainkan peranan penting dalam完美转发ing hujah dengan menggunakan lebihan fungsi tertentu berdasarkan jenis rujukan yang diluluskan. Contohnya:
template<class T> void perfectSet(T &&t) { set(std::forward<T>(t)); }
Dengan memanggil std::forward
Memahami Kelakuan
Untuk menunjukkan cara std::forward mengekalkan nilai-nilai hujah, pertimbangkan kod berikut:
void perfectSet(T &&t) { set(t); // Preserves `t` as an lvalue set(t); // `t` remains unchanged }
Bandingkan dengan:
void perfectSet(T &&t) { set(std::forward<T>(t)); // Preserves `t` as an rvalue set(t); // `t` is now empty due to move semantics }
Tanpa std::forward, pengkompil menganggap bahawa t mungkin boleh diakses semula dan memilih untuk mengekalkannya sebagai lnilai. Walau bagaimanapun, menggunakan std::forward membenarkan pengkompil mengendalikan t dengan betul sebagai nilai r, menyebabkan kandungannya dialihkan.
Atas ialah kandungan terperinci Bagaimanakah std::forward mendayakan pemajuan yang sempurna dan mengekalkan nilai-nilai hujah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!