Rumah > pembangunan bahagian belakang > C++ > Mengapakah std::array memerlukan pendakap kerinting berganda untuk senarai pemula manakala std::vector tidak?

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
875 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!

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