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
Mary-Kate Olsenasal
2024-12-17 15:07:09290semak imbas

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
}

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) ... };
}

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)), ...);

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