Rumah > Artikel > pembangunan bahagian belakang > Mengapa Anda Tidak Boleh Menggunakan `std::string` dalam C Union?
Mengapa Pengkompil Tidak Membenarkan std::string dalam Unions?
Apabila bekerja dengan C, selalunya perlu menggunakan struktur data yang boleh menyimpan pelbagai jenis data. Satu struktur sedemikian ialah kesatuan, yang memberikan berbilang pembolehubah ke lokasi memori yang sama. Walau bagaimanapun, satu persoalan biasa timbul mengenai batasan kesatuan terhadap ahli mereka.
Satu sekatan penting ialah ketidakupayaan untuk memasukkan kelas dengan pembina salinan bukan remeh dalam kesatuan. Ini termasuk kelas seperti std::string. Untuk memahami sebabnya, pertimbangkan senario berikut:
union U { std::string x; std::vector<int> y; }; U u; // <--
Secara tradisinya, dalam struct, memulakan u.x atau u.y akan menetapkannya kepada nilai lalai. Walau bagaimanapun, dalam kesatuan, semua ahli berkongsi alamat yang sama, menjadikannya mustahil untuk memberikan nilai kepada kedua-dua ahli tanpa menimpa data. Jika tiada ahli dimulakan, menggunakannya akan mengakibatkan tingkah laku yang tidak ditentukan.
C 98 menangani isu ini dengan melarang kelas dengan pembina bukan remeh daripada menjadi ahli kesatuan. Secara khusus, ia dinyatakan dalam §9.5/1:
"Objek kelas dengan pembina bukan remeh (12.1), pembina salinan bukan remeh (12.8), pemusnah bukan remeh (12.4) , atau pengendali tugasan salinan bukan remeh (13.5.3, 12.8) tidak boleh menjadi ahli kesatuan, begitu juga susunan objek sedemikian."
Sekatan ini memastikan manipulasi data dalam kesatuan boleh dikendalikan dengan berkesan.
C 0x melonggarkan peraturan ini sedikit sebanyak (§9.5/2), membenarkan paling banyak satu ahli data bukan statik dengan pemula pendakap atau sama. Walau bagaimanapun, menulis pembina dan pemusnah salinan bebas ralat untuk kesatuan masih rumit. Atas sebab ini, kesatuan teg atau perpustakaan pihak ketiga seperti boost::variant dan boost:: any menyediakan penyelesaian alternatif untuk bekerja dengan data heterogen.
Atas ialah kandungan terperinci Mengapa Anda Tidak Boleh Menggunakan `std::string` dalam C Union?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!