Rumah > pembangunan bahagian belakang > C++ > Mengapa Saya Boleh Memulakan Agregat dengan Pembina Lalai Peribadi?

Mengapa Saya Boleh Memulakan Agregat dengan Pembina Lalai Peribadi?

DDD
Lepaskan: 2024-11-15 12:21:03
asal
682 orang telah melayarinya

Why Can I Initialize an Aggregate with a Private Default Constructor?

Pembina Persendirian dan Permulaan Agregat: Interaksi Tidak Dijangka

Dalam C , mengisytiharkan pembina lalai sebagai persendirian secara semula jadi akan menyebabkan seseorang menganggap bahawa pembinaan lalai bagi jenis yang berkaitan akan menjadi tidak boleh diakses. Walau bagaimanapun, tingkah laku pelik muncul apabila menggunakan sintaks permulaan yang disertakan dengan pendakap.

Pertimbangkan contoh berikut:

class C {
    C() = default;
};

int main() {
    C c;           // error: C::C() is private
    auto c2 = C(); // error: calling a private constructor
}
Salin selepas log masuk

Tanpa diduga, kod di atas menjana ralat pada semua penyusun utama. Ini adalah tingkah laku yang dijangka kerana pembina lalai memang diisytiharkan sebagai peribadi. Walau bagaimanapun, menggunakan pemulaan tertutup pendakap tiba-tiba membenarkan pembinaan lalai:

int main() {
    C c{};         // OK
    auto c2 = C{}; // OK
}    
Salin selepas log masuk

Sebab di sebalik tingkah laku yang tidak dijangka ini terletak pada selok-belok perpustakaan standard C. Menurut piawaian C 14 (8.4.2/5), fungsi dianggap "disediakan pengguna" jika ia diisytiharkan pengguna dan tidak diingkari atau dipadamkan secara eksplisit pada pengisytiharan pertamanya.

Dalam kes kelas C di atas, pembina lalai secara eksplisit lalai pada pengisytiharan pertamanya. Ini bermakna ia tidak dianggap "disediakan pengguna." Akibatnya, kelas C tidak mempunyai pembina yang disediakan pengguna, yang menjadikannya sebagai agregat mengikut takrifan dalam 8.5.1/1:

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).
Salin selepas log masuk

Akibatnya, pemulaan tertutup pendakap dibenarkan untuk C kelas, membenarkan pembinaan lalai walaupun pembina diisytiharkan sebagai peribadi. Tingkah laku ini boleh mengejutkan dan boleh membawa kepada akibat yang tidak diingini dalam senario tertentu.

Atas ialah kandungan terperinci Mengapa Saya Boleh Memulakan Agregat dengan Pembina Lalai Peribadi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan