Rumah > pembangunan bahagian belakang > C++ > Mengapa Saya Mendapat Ralat Penyusunan Apabila Memulakan std::array dengan Senarai Pemula?

Mengapa Saya Mendapat Ralat Penyusunan Apabila Memulakan std::array dengan Senarai Pemula?

Linda Hamilton
Lepaskan: 2024-10-29 08:15:30
asal
695 orang telah melayarinya

Why Do I Get Compilation Errors When Initializing a std::array with an Initializer List?

Menggunakan std::array dengan Senarai Permulaan: Menyelesaikan Misteri Sintaksis

Dalam bidang struktur data C, std::array berdiri keluar dengan peruntukan memori saiz tetapnya. Walaupun kepelbagaiannya membenarkan pemula menggunakan senarai pemula, beberapa cabaran yang tidak dijangka mungkin timbul.

Enigma Sintaks

Menurut pertanyaan, percubaan untuk memulakan std::array menggunakan senarai pemula, seperti yang digambarkan di bawah, mengakibatkan ralat penyusunan:

<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });</code>
Salin selepas log masuk

Walau bagaimanapun, senarai permulaan berfungsi dengan lancar dengan std::vector. Perbezaan ini menimbulkan persoalan: adakah ini salah faham tentang keupayaan std::array atau kecacatan dalam pelaksanaan Perpustakaan Standard C GNU?

Menyingkap Penyelesaian

Di sebalik scenes, std::array dibina sebagai struct:

<code class="cpp">template<typename T, int size>
struct std::array
{
  T a[size];
};</code>
Salin selepas log masuk

Struktur ini merangkum tatasusunan, tetapi anehnya, ia tidak mempunyai pembina yang menerima senarai pemula. Namun begitu, memandangkan std::array layak sebagai agregat dalam C 11, pemulaan agregat menjadi pendekatan alternatif.

Untuk mencapai pemulaan agregat, set tambahan pendakap kerinting diperlukan untuk menyasarkan tatasusunan dalam struct:

<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
Salin selepas log masuk

Anomali Penyusun

Piawaian C mencadangkan bahawa pendakap kerinting tambahan dalam contoh di atas boleh diketepikan. Walau bagaimanapun, ralat pengkompil yang dihadapi mencadangkan pepijat yang berpotensi dalam pelaksanaan GCC, yang gagal mengecam permulaan agregat.

Kesimpulan

Walaupun isu ini mungkin kelihatan membingungkan pada mulanya Sepintas lalu, kuncinya terletak pada memahami struktur asas std::array dan selok-belok permulaan agregat. Sintaks pendakap kerinting berganda menyelesaikan ralat kompilasi dan membenarkan penciptaan std::arrays menggunakan senarai pemula, seperti yang dimaksudkan oleh standard C.

Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat Penyusunan Apabila Memulakan std::array dengan 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