C 11 memperkenalkan struktur data std::array, yang menyerupai tatasusunan gaya C tetapi menyediakan ciri tambahan seperti templat- spesifikasi jenis berasaskan dan penentuan saiz masa kompilasi. Walau bagaimanapun, persoalan biasa timbul: adakah pengisytiharan std::array tanpa pengamulaan eksplisit menghasilkan pengamulaan lalai untuk setiap elemen?
Mengikut spesifikasi bahasa C (§8.5/11), sebarang objek tanpa pemula eksplisit mengalami permulaan lalai. Ini termasuk objek std::array. Inisialisasi lalai memulakan objek bukan jenis kelas, tetapi untuk objek jenis kelas (yang std::array ialah), ia memanggil pembina lalai.
Walau bagaimanapun, dokumentasi cppreference menyebut bahawa pembina lalai "default- membina atau menyalin-membina setiap elemen tatasusunan." Ini menunjukkan bahawa std::array mungkin tidak melakukan pengamulaan lalai untuk setiap elemen.
Jawapan:
Ya, secara lalai, mengisytiharkan std::array tanpa pengamulaan eksplisit akan memulakan lalai semua elemen mengikut spesifikasi C 11. Tingkah laku ini digunakan pada tatasusunan bersaiz sifar dan bukan bersaiz sifar.
Permulaan Nilai lwn Permulaan Lalai:
Perhatikan bahawa pemulaan nilai (8.5/7) berbeza daripada permulaan lalai. Permulaan nilai memberikan elemen nilai lalai jenis masing-masing, yang biasanya sifar atau palsu untuk jenis primitif. Untuk melaksanakan pemulaan nilai secara eksplisit, seseorang boleh menggunakan pendakap kerinting dengan pemula kosong:
<code class="cpp">std::array<int, 13> cxx_style_array{}; // Value-initialize all elements to 0</code>
Ini secara eksplisit menetapkan semua elemen kepada nilai lalai int, iaitu 0.
Atas ialah kandungan terperinci Adakah std::array Default-Initialized dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!