Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengulangi Pek Parameter C dengan Betul untuk Mengelakkan Ralat Pengkompil?

Bagaimanakah Saya Boleh Mengulangi Pek Parameter C dengan Betul untuk Mengelakkan Ralat Pengkompil?

Mary-Kate Olsen
Lepaskan: 2024-12-17 15:07:09
asal
352 orang telah melayarinya

How Can I Correctly Iterate Over a C   Parameter Pack to Avoid Compiler Errors?

Menggelung pada Pek Parameter dengan Peluasan Pek

Dalam templat variadic, pek parameter membenarkan bilangan argumen yang fleksibel dihantar ke fungsi . Semasa cuba mengulangi pek parameter, ralat pengkompil mungkin timbul jika pek tidak dikembangkan dengan betul.

Pertimbangkan kod berikut:

template<typename... Args>
static void foo2(Args... args)
{
    (bar(args)...); // Error: parameter pack must be expanded
}
Salin selepas log masuk

Kod ini gagal dikompilasi dengan ralat "Ralat C3520: 'args': pek parameter mesti dikembangkan dalam konteks ini." Sebab ralat ini ialah args pek parameter perlu dikembangkan sebelum ia boleh digunakan dalam panggilan fungsi bar.

Salah satu cara untuk mencapai pengembangan ini ialah dengan menggunakan braced-init-list (senarai inisial disertakan dalam pendakap). Dengan meletakkan pengembangan di dalam senarai pemula tatasusunan dummy, pengkompil boleh melakukan pengembangan yang diperlukan.

template<typename... Args>
static void foo2(Args &&&... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}
Salin selepas log masuk

Senarai pemula membenarkan keseluruhan pek dikembangkan dan pelakon untuk membatalkan memastikan koma operator digunakan, tanpa mengira mana-mana operator yang terlebih beban untuk jenis bar pemulangan.

Pendekatan alternatif, yang diperkenalkan dalam C 17, ialah penggunaan ungkapan lipat:

((void) bar(std::forward<Args>(args)), ...);
Salin selepas log masuk

Kod ini menyediakan cara ringkas dan cekap untuk menggelung pada pek parameter.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengulangi Pek Parameter C dengan Betul untuk Mengelakkan Ralat Pengkompil?. 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