Dengan C ++ 11 std::array
, apakah saya mendapat jaminan bahwa sintaks std::array<T, N> x;
akan menginisialisasi semua elemen array secara default?
EDIT : jika tidak, apakah ada sintaks yang akan bekerja pada semua array (termasuk array berukuran nol) untuk menginisialisasi semua elemen ke nilai defaultnya?
EDIT : di cppreference , deskripsi konstruktor default mengatakan:
(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array
jadi jawabannya mungkin ya. Tapi saya ingin memastikan itu sesuai dengan standar atau standar masa depan.
T x[N]
sintaks.Jawaban:
Menurut definisi, inisialisasi default adalah inisialisasi yang terjadi ketika tidak ada inisialisasi lain yang ditentukan; bahasa C ++ menjamin Anda bahwa objek apa pun yang tidak Anda berikan penginisialisasi eksplisitnya akan diinisialisasi default (C ++ 11 §8.5 / 11). Itu termasuk objek bertipe
std::array<T, N>
danT[N]
.Ketahuilah bahwa ada jenis yang inisialisasi defaultnya tidak berpengaruh dan membiarkan nilai objek tidak dapat ditentukan: jenis non-kelas, non-larik (§8.5 / 6). Akibatnya, array objek yang diinisialisasi default dengan tipe seperti itu akan memiliki nilai tak tentu, misalnya:
Baik larik gaya-c dan
std::array
diisi dengan bilangan bulat dengan nilai tak tentu, seperti yangplain_int
memiliki nilai tak tentu.Saya menduga bahwa ketika Anda mengatakan "ke nilai defaultnya" yang Anda maksud adalah "menginisialisasi semua elemen ke
T{}
". Itu bukan inisialisasi default , ini adalah inisialisasi nilai (8.5 / 7). Anda dapat meminta inisialisasi nilai dengan cukup mudah di C ++ 11 dengan memberikan penginisialisasi kosong pada setiap deklarasi:Yang akan menginisialisasi nilai semua elemen array secara bergantian, menghasilkan
plain_old_int
, dan semua anggota dari kedua jenis array, diinisialisasi ke nol.sumber
boost::value_initialized
tautan mereka tetapi saya yakin VC12 (VS2013) memiliki dukungan yang jauh lebih baik sekarang.Default-inisialisasi adalah istilah dari Standard yang berpotensi berarti tidak ada inisialisasi sama sekali, jadi yang Anda maksud mungkin adalah inisialisasi nol .
Deskripsi di cppreference.com sebenarnya agak menyesatkan.
std::array
adalah kelas agregat, dan jika jenis elemennya primitif, itu adalah POD: "data lama biasa", dengan semantik yang sangat cocok dengan bahasa C. Konstruktor yang didefinisikan secara implisitstd::array< int, N >
adalah konstruktor sepele yang sama sekali tidak melakukan apa pun.Sintaks suka
std::array< int, 3 >()
ataustd::array< int, 3 > x{}
yang memberikan nilai nol tidak dilakukan dengan memanggil konstruktor. Mendapatkan nol adalah bagian dari inisialisasi nilai , ditentukan dalam C ++ 11 §8.5 / 8:std::array
tidak memiliki konstruktor default yang disediakan pengguna, sehingga inisialisasi nol. Ini memiliki konstruktor default yang didefinisikan secara implisit, tetapi itu sepele, jadi tidak pernah diinisialisasi secara default. (Tapi ini tidak membuat perbedaan karena inisialisasi sepele menurut definisi tidak berpengaruh pada waktu proses.)Array gaya-C dan
std::array
keduanya merupakan agregat, dan cara untuk menginisialisasi semua agregat dengan nol adalah dengan sintaks= {}
. Ini berfungsi sejak C ++ 98. Perhatikan bahwa array gaya-C tidak boleh memiliki luas nol, dan itusizeof (std::array< X, 0 >)
bukan nol.sumber
Keduanya
T x[N];
danstd::array<T, N> x;
default-inisialisasi setiap elemen array.Misalnya, jika
T = std::string
, setiap elemen akan menjadi string kosong. JikaT
kelas tanpa konstruktor default, keduanya akan gagal dikompilasi. JikaT = int
, setiap elemen akan memiliki nilai tak tentu (kecuali deklarasi itu kebetulan berada di ruang lingkup namespace)sumber
Pertama-tama, T x [N] tidak menginisialisasi elemen secara default, meskipun inisialisasi default dari skalar tipe T sebenarnya tidak melakukan apa-apa. Di atas juga berlaku untuk std :: array x. Saya pikir yang Anda butuhkan adalah inisialisasi daftar.
sumber
C ++ 11 std :: array :: fill adalah opsi yang bagus untuk beberapa kasus.
sumber