Apakah std::forward dan bagaimanakah ia memastikan pemajuan yang sempurna untuk rujukan lvalue dan rvalue dalam C ?

Barbara Streisand
Lepaskan: 2024-11-19 05:27:03
asal
128 orang telah melayarinya

What is std::forward and how does it ensure perfect forwarding for lvalue and rvalue references in C  ?

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 boleh mengelirukan. std::forward sebenarnya tidak menukar jenis; sebaliknya, ia ditakrifkan oleh jadual yang menentukan tindakan yang sesuai berdasarkan jenis yang dimajukan. Berikut ialah pecahan mekanisme asas:

  • Untuk rujukan nilai (T&): std::forward hanya mengembalikan rujukan kepada hujah.
  • Untuk rujukan rvalue (T&&): std::forward mengembalikan rujukan rvalue kepada hujah.
  • Untuk jenis penunjuk (T* atau T*&): std::forward mengembalikan penunjuk kepada hujah. Salinan penunjuk tidak dibuat.
  • Untuk rujukan auto (auto& atau auto&&): std::forward memajukan hujah sebagai rujukan lvalue atau rvalue, bergantung pada jenis hujah diluluskan.

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

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 .

  • Rujukan nilai (T&): Merujuk kepada objek sedia ada.
  • Rujukan Rvalue (T&&): Merujuk kepada objek sementara yang dicipta oleh ungkapan.

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan