Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengulangi Pek Parameter C dengan Betul untuk Mengelakkan Ralat Pengkompil?
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!