Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah std::forward mendayakan pemajuan yang sempurna dan mengekalkan nilai-nilai hujah?

Bagaimanakah std::forward mendayakan pemajuan yang sempurna dan mengekalkan nilai-nilai hujah?

Susan Sarandon
Lepaskan: 2024-11-14 17:42:02
asal
468 orang telah melayarinya

How does std::forward enable perfect forwarding and preserve the rvalue-ness of arguments?

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`
Salin selepas log masuk

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

Dengan memanggil std::forward(t) di dalam perfectSet, pengkompil diarahkan untuk memajukan t sebagai sama ada rujukan atau rujukan rnilai, bergantung pada jenis t.

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

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

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!

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