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

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

Barbara Streisand
Lepaskan: 2024-10-24 18:25:02
asal
888 orang telah melayarinya

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

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

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

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

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