Rumah >pembangunan bahagian belakang >C++ >Mengapa Permulaan std::array dengan Senarai Permulaan Menyebabkan Ralat Penyusunan dalam 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>
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>
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>
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!