Mengapakah std::array memerlukan pendakap kerinting berganda untuk senarai pemula manakala std::vector tidak?

Mary-Kate Olsen
Lepaskan: 2024-11-07 03:40:03
asal
740 orang telah melayarinya

Why does std::array require double curly braces for initializer lists while std::vector doesn't?

C Initializer_List Behavior Discrepancy untuk std::vector and std::array

Apabila menggunakan senarai pemula untuk bekas C, perbezaan yang membingungkan timbul antara std::vector dan std::array. Mari kita terokai sebab di sebalik tingkah laku ini.

Masalah:

Pertimbangkan kod berikut:

std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
Salin selepas log masuk

Mengapa perlu menggunakan kerinting berganda pendakap untuk std::array tetapi bukan untuk std::vector?

Jawapan:

Tingkah laku berpunca daripada sifat std::array sebagai agregat. Agregat tidak mempunyai pembina yang diisytiharkan pengguna, termasuk yang menerima senarai pemula. Akibatnya, pemulaan agregat untuk std::array dilakukan melalui pemulaan "gaya lama" menggunakan sintaks =:

std::array<int, 4> y = { { 1, 2, 3, 4 } };
Salin selepas log masuk

Dalam gaya lama ini, pendakap tambahan mungkin ditinggalkan, menghasilkan kod yang setara:

std::array<int, 4> y = { 1, 2, 3, 4 };
Salin selepas log masuk

Walau bagaimanapun, penyingkiran pendakap ini hanya dibenarkan apabila menggunakan pemula gaya lama dengan sintaks =. Inisialisasi senarai langsung, yang tidak menggunakan sintaks =, tidak membenarkan penyingkiran pendakap. Had ini dikawal oleh C 11 §8.5.1/11.

Resolusi Cadangan:

Laporan kecacatan (cacatan CWG #1270) telah dibangkitkan untuk menangani perkara ini had. Jika resolusi yang dicadangkan diterima pakai, penyingkiran pendakap akan dibenarkan untuk semua bentuk permulaan senarai, termasuk yang berikut:

std::array<int, 4> y{ 1, 2, 3, 4 };
Salin selepas log masuk

Perubahan ini akan membawa konsistensi kepada tingkah laku std::vector dan std::array apabila menggunakan senarai pemula.

Atas ialah kandungan terperinci Mengapakah std::array memerlukan pendakap kerinting berganda untuk senarai pemula manakala std::vector tidak?. 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!