Rumah >pembangunan bahagian belakang >C++ >Mengapakah pembina lalai peribadi dalam C berfungsi apabila digunakan dengan pendakap kerinting tetapi gagal dengan kurungan?

Mengapakah pembina lalai peribadi dalam C berfungsi apabila digunakan dengan pendakap kerinting tetapi gagal dengan kurungan?

Susan Sarandon
Susan Sarandonasal
2024-11-11 14:00:03419semak imbas

Why does a private default constructor in C   work when used with curly braces but fail with parentheses?

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!

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