Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ## Bilakah Saya Harus Menggunakan std::forward dalam C ?

## Bilakah Saya Harus Menggunakan std::forward dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-10-24 18:25:02751semak imbas

## When Should I Use std::forward in C  ?

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(arg) memastikan bahawa hujah dimajukan ke fungsi bar sebagai sama ada rujukan lvalue atau rvalue, bergantung pada jenis arg.

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!

Kenyataan:
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