Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `std::array` Memerlukan Pendakap Kerinting Berganda dalam Senarai Pemula?

Mengapakah `std::array` Memerlukan Pendakap Kerinting Berganda dalam Senarai Pemula?

Barbara Streisand
Barbara Streisandasal
2024-11-08 05:07:01379semak imbas

Why Does `std::array` Require Double Curly Braces in Initializer Lists?

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!

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