Memajukan Argumen dengan std::forward
Dalam C 0x, std::forward digunakan untuk memajukan argumen ke panggilan fungsi lain. Ini berfaedah apabila anda ingin mengelak daripada menyalin atau memindahkan hujah secara eksplisit.
Penggunaan std::forward melibatkan penggunaan tatatanda &&& dalam parameter fungsi. Notasi ini membolehkan anda menerima rujukan lvalue dan rvalue sebagai argumen.
Dalam contoh yang diberikan:
<code class="cpp">template<class T> void foo(T&&& arg) { bar(std::forward<T>(arg)); }</code>
Ungkapan std::forward
Walau bagaimanapun, anda tidak seharusnya menggunakan std::forward dalam semua kes. Ia hanya perlu apabila anda perlu mengekalkan jenis rujukan hujah. Sebagai contoh, jika anda mempunyai fungsi yang tidak mengambil rujukan rvalue, anda tidak seharusnya menggunakan std::forward.
Dalam contoh berikut:
<code class="cpp">template<int val, typename... Params> void doSomething(Params... args) { doSomethingElse<val, Params...>(args...); }</code>
Anda tidak perlu menggunakan std::forward kerana fungsi doSomethingElse boleh mengambil rujukan lvalue atau rvalue.
Walau bagaimanapun, jika anda mempunyai fungsi yang mengambil rujukan rvalue, anda harus menggunakan std::forward untuk memastikan bahawa argumen dimajukan sebagai rvalue rujukan. Contohnya:
<code class="cpp">template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); }</code>
Dalam contoh ini, std::forward digunakan untuk memastikan bahawa hujah dimajukan sebagai rujukan nilai, walaupun pada mulanya ia adalah rujukan nilai.
Akhir sekali, anda tidak seharusnya memajukan hujah berkali-kali. Ini boleh membawa kepada tingkah laku yang tidak ditentukan. Contohnya, kod berikut tidak betul:
<code class="cpp">template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); doSomethingWeird<val, Params...>(std::forward<Params>(args)...); }</code>
Dalam contoh ini, hujah dimajukan dua kali, yang boleh membawa kepada tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci ## Bilakah Saya Harus Menggunakan std::forward dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!