Rumah >pembangunan bahagian belakang >C++ >Mengapakah pembina lalai peribadi dalam C berfungsi apabila digunakan dengan pendakap kerinting tetapi gagal dengan kurungan?
Bayang Peribadi Pembina Lalai
Apabila mengisytiharkan jenis dengan niat untuk menjadikan pembina lalainya peribadi, menggunakan kata kunci lalai mungkin tidak mencapai hasil yang diingini, seperti yang digambarkan dalam kod berikut coretan:
class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // error: as above }
Anehnya, kod ini menjana ralat walaupun secara eksplisit menjadikan pembina peribadi. Walau bagaimanapun, kod berikut berjaya dikompilasi:
class C { C() = default; }; int main() { C c{}; // OK on all compilers auto c2 = C{}; // OK on all compilers }
Mengapakah pembina berkelakuan berbeza apabila digunakan dengan pendakap kerinting?
C 14 Default Constructor Defaultness
Kuncinya terletak pada standard C 14 (8.4.2/5 [dcl.fct.def.default]), yang mentakrifkan fungsi "disediakan pengguna" sebagai fungsi yang "diisytiharkan pengguna dan tidak diingkari atau dipadamkan secara eksplisit pada pengisytiharan pertamanya." Ini menunjukkan bahawa pembina lalai dalam contoh kami tidak dianggap disediakan pengguna kerana ia telah lalai secara eksplisit.
Pencahayaan Pembina Agregat
Akibatnya, kelas C mempunyai tiada pembina yang disediakan pengguna. Oleh itu, ia diklasifikasikan sebagai agregat mengikut 8.5.1/1 [dcl.init.aggr], yang menyatakan bahawa agregat ialah "tatasusunan atau kelas tanpa pembina yang disediakan pengguna, tiada peribadi atau dilindungi bukan statik. ahli data, tiada kelas asas dan tiada fungsi maya."
Pembinaan Agregat dengan Pendakap
Agregat mempunyai peraturan pembinaan khas yang membenarkan ia dibina menggunakan pendakap kerinting {} walaupun ia mempunyai pembina persendirian. Peraturan ini bertujuan untuk memudahkan pemulaan agregat, seperti tatasusunan dan struktur, yang biasanya mengandungi berbilang ahli.
Oleh itu, pembina kelas C, walaupun ditandakan sebagai peribadi, masih boleh digunakan dalam pendakap kerinting kerana kelas itu sendiri dianggap sebagai agregat.
Atas ialah kandungan terperinci Mengapakah pembina lalai peribadi dalam C berfungsi apabila digunakan dengan pendakap kerinting tetapi gagal dengan kurungan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!