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

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