Rumah > Artikel > pembangunan bahagian belakang > Mengapakah `std::array` Memerlukan Pendakap Kerinting Berganda dalam Senarai Pemula?
Gelagat Senarai Pemula: Perbezaan dalam std::vector dan std::array
Manakala std::vector dan std::array adalah kedua-dua bekas dalam C , tingkah laku mereka dengan senarai pemula berbeza. Dalam artikel ini, kami akan meneroka selok-belok permulaan agregat dan memahami sebab pendakap kerinting berganda diperlukan untuk std::array.
Pertimbangkan coretan kod berikut yang memulakan std::vector dan std:: tatasusunan:
std::vector<int> x{1,2,3,4}; std::array<int, 4> y{{1,2,3,4}};
std::Vector Initialization
std::vector menyokong pembina yang ditentukan pengguna, termasuk yang menerima std::initializer_list. Oleh itu, kita boleh secara langsung memulakan x menggunakan pendakap tanpa memerlukan pendakap kerinting tambahan.
std::array Initialization
Tidak seperti std::vector, std::array ialah agregat yang tidak mempunyai pembina yang ditentukan pengguna. Sebaliknya, ia bergantung pada pemulaan agregat, ciri yang diwarisi daripada C.
Dalam pemulaan agregat "gaya lama", tanda sama dan titik bertindih digunakan:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
Walau bagaimanapun, apabila menggunakan langsung senarai permulaan (diperkenalkan dalam C 11), ini = sintaks tidak lagi sah. Selain itu, penyingkiran pendakap, yang membenarkan pengabaian pendakap tambahan, hanya dibenarkan dalam pengisytiharan dengan gaya lama = sintaks. Untuk permulaan senarai langsung, pendakap tambahan adalah wajib.
Kecacatan CWG
Laporan kecacatan CWG (cacatan CWG #1270) bertujuan untuk menyelesaikan sekatan ini dengan membenarkan penghapusan pendakap untuk bentuk permulaan senarai yang lain. Jika diterima pakai, kod berikut akan dibentuk dengan baik:
std::array<int, 4> y{ 1, 2, 3, 4 };
Kesimpulannya, perbezaan tingkah laku antara std::vector dan std::array dengan senarai pemula berpunca daripada ciri asasnya sebagai kelas dengan pembina yang ditentukan pengguna dan agregat bergantung pada permulaan agregat, masing-masing. Pendakap kerinting berganda diperlukan untuk std::array agar mematuhi peraturan pemula agregat, manakala std::vector membenarkan pemulaan langsung menggunakan satu set pendakap tanpa bergantung pada sintaks permulaan agregat gaya lama.
Atas ialah kandungan terperinci Mengapakah `std::array` Memerlukan Pendakap Kerinting Berganda dalam Senarai Pemula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!