std::forward: Pemajuan Sempurna untuk Rujukan Lvalue dan Rvalue
Memahami std::forward
std::forward ialah fungsi utiliti C 11 yang membenarkan pemajuan yang sempurna, memastikan rujukan nilai dikekalkan sebagai rujukan nilai, dan rujukan nilai dikekalkan sebagai rujukan nilai. Ini amat berguna dalam pengaturcaraan templat yang penting untuk mengekalkan sifat asal hujah yang diluluskan.
Mekanisme std::forward
Salah tanggapan yang std: :forward pada asasnya adalah static_cast
Sempurna Pemajuan
Dalam konteks pengaturcaraan templat, std::forward menjadi penting apabila anda mempunyai fungsi templat yang menerima jenis generik dan memajukannya ke fungsi lain. Matlamatnya adalah untuk memastikan bahawa hujah yang dimajukan dilayan dengan cara yang sama seperti hujah asal.
Pertimbangkan contoh fungsi templat perfectSet yang memajukan hujah t jenis T&& kepada set fungsi. Bergantung pada cara perfectSet dipanggil, t boleh sama ada rujukan nilai atau rujukan nilai. Tingkah laku yang diingini adalah untuk ditetapkan untuk merawat t sewajarnya.
Tanpa std::forward, pengkompil perlu menganggap bahawa t diluluskan oleh rujukan nilai, yang berpotensi membawa kepada penyalinan data. Walau bagaimanapun, dengan menggunakan std::forward, kami mengarahkan pengkompil untuk mengekalkan sifat asal t:
template<class T> void perfectSet(T&& t) { set(std::forward<T>(t)); }
Jika t ialah rujukan lvalue, std::forward akan mengembalikan rujukan lvalue, dan set akan laksanakan lebihan rujukan nilainya, yang membawa kepada penyalinan data. Tetapi jika t ialah rujukan rvalue, std::forward akan mengembalikan rujukan rvalue dan set akan melaksanakan lebihan rujukan rvaluenya, mengakibatkan operasi bergerak.
Menyelesaikan Kekeliruan Nilai/Rvalue
Percanggahan yang ketara dalam tingkah laku std::forward apabila menghantar benda&& vs benda& mungkin kelihatan mengelirukan pada pandangan pertama. Walau bagaimanapun, ia berpunca daripada fakta bahawa rujukan nilai dan rujukan nilai adalah entiti yang berbeza dalam C .
Untuk mengekalkan sifat asal, kedua-dua fungsi templat dan fungsi penerima mesti menggunakan rvalue rujukan apabila menerima rnilai. Inilah yang dipastikan oleh std::forward, memastikan pemajuan yang sempurna dan prestasi optimum.
Atas ialah kandungan terperinci Apakah std::forward dan bagaimanakah ia memastikan pemajuan yang sempurna untuk rujukan lvalue dan rvalue dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!