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

Barbara Streisand
Lepaskan: 2024-11-08 05:07:01
asal
378 orang telah melayarinya

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}};
Salin selepas log masuk

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 } };
Salin selepas log masuk

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 };
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!