Rumah > pembangunan bahagian belakang > C++ > Mengapa Permulaan std::array dengan Senarai Permulaan Menyebabkan Ralat Penyusunan dalam GCC 4.6.1?

Mengapa Permulaan std::array dengan Senarai Permulaan Menyebabkan Ralat Penyusunan dalam GCC 4.6.1?

DDD
Lepaskan: 2024-10-29 09:51:30
asal
615 orang telah melayarinya

Why Does Initializing std::array with an Initialization List Cause a Compilation Error in GCC 4.6.1?

Menggunakan std::array dengan Initialization Lists: A Compiler Conundrum

Sedangkan sintaks untuk menggunakan senarai permulaan dengan std::array mungkin kelihatan mudah, sesetengah pengguna telah menghadapi kesukaran apabila cuba melaksanakannya. Contoh yang disediakan dalam soalan:

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

mengakibatkan ralat kompilasi dalam GCC 4.6.1 disebabkan oleh token yang tidak dijangka sebelum koma. Ketidakkonsistenan ini dengan gelagat std::vector, yang menerima senarai permulaan tanpa isu, telah membawa kepada kekeliruan dan spekulasi tentang kesahihan sintaks.

Memahami Sifat std::array

Untuk memahami percanggahan ini, adalah penting untuk mengkaji definisi std::array:

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

Seperti yang terbukti daripada definisi ini, std::array pada asasnya ialah struct melampirkan tatasusunan. Ia tidak mempunyai pembina yang secara langsung menerima senarai permulaan. Walau bagaimanapun, mengikut peraturan C 11, std::array dianggap sebagai agregat. Ini membolehkan untuk permulaan agregat, yang melibatkan pemulaan elemen tatasusunan secara tidak langsung.

Mengatasi Enigma Sintaks

Untuk berjaya memulakan tatasusunan std::array menggunakan pemulaan agregat, set tambahan pendakap kerinting diperlukan:

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

Dengan menyarangkan pendakap kerinting, pengkompil mengenali niat untuk memulakan elemen tatasusunan dalam struct. Ini menghapuskan ralat kompilasi yang dialami dengan contoh pertama.

Pepijat GCC atau Penyimpangan Standard?

Menariknya, piawaian C membayangkan bahawa pendakap tambahan boleh ditinggalkan dalam ini kes tertentu. Oleh itu, berkemungkinan GCC 4.6.1 mengalami pepijat yang menghalang tafsiran yang betul bagi sintaks yang dipermudahkan.

Atas ialah kandungan terperinci Mengapa Permulaan std::array dengan Senarai Permulaan Menyebabkan Ralat Penyusunan dalam GCC 4.6.1?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan