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
Linda Hamiltonasal
2024-10-29 08:15:30695semak imbas

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>

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>

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>

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!

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