Rumah >pembangunan bahagian belakang >C++ >Bolehkah Jenis Tidak Lengkap Dimulakan dalam Bekas Standard?

Bolehkah Jenis Tidak Lengkap Dimulakan dalam Bekas Standard?

Susan Sarandon
Susan Sarandonasal
2024-11-05 22:56:02813semak imbas

Can Incomplete Types Be Instantiated in Standard Containers?

Penyebaran Jenis Tidak Lengkap dalam Bekas Standard

Dalam C , bekas seperti std::vector dan std::map membenarkan instantiasi bekas dengan jenis yang tidak lengkap. Amalan ini biasanya digunakan untuk mencipta struktur rekursif melalui jenis rujukan sendiri. Walau bagaimanapun, piawaian C menimbulkan persoalan sama ada instantiasi sedemikian dibenarkan.

Menurut §17.6.4.8 standard C 11, instantiasi jenis yang tidak lengkap boleh membawa kepada tingkah laku yang tidak ditentukan jika tidak dibenarkan secara eksplisit. Sesetengah bekas, seperti std::vector, berfungsi dengan sewajarnya dengan jenis yang tidak lengkap kerana ia tidak mempunyai ahli jenis_nilai atau fungsi yang berinteraksi dengan objek jenis_nilai mengikut nilai. Walau bagaimanapun, std::map mempamerkan tingkah laku bermasalah dalam hal ini.

Niat standard adalah untuk melarang instantiasi jenis yang tidak lengkap, walaupun pelaksanaan tertentu mungkin tidak menghadapi masalah. Ini disebabkan terutamanya oleh kesukaran pelaksanaan yang berpotensi, seperti mengoptimumkan std::vector untuk bilangan elemen tetap, yang boleh pecah jika struktur rekursif dibenarkan.

Oleh itu, piawaian mewajibkan penggunaan jenis lengkap untuk bekas instansiasi. Walau bagaimanapun, ia mengakui kemungkinan mencipta templat kelas tersuai yang menyokong jenis tidak lengkap secara eksplisit, seperti yang ditunjukkan oleh std::unique_ptr.

Akibatnya, bekas standard tidak boleh digunakan dengan jenis yang tidak lengkap, walaupun ia dibenarkan untuk cipta templat kelas tersuai yang menampung penggunaan sedemikian.

Atas ialah kandungan terperinci Bolehkah Jenis Tidak Lengkap Dimulakan dalam Bekas Standard?. 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