std::array
bir topludır. Yalnızca bir veri üyesine sahiptir - std::array
özelleştirmesinin belirtilen türden bir dizisidir. C++ Standardına göre. (8.5.1 Agregalar)
2 When an aggregate is initialized by an initializer list, as specified in 8.5.4, the elements of the initializer list are taken as initializers for the members of the aggregate, in increasing subscript or member order
std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
daha başlatıcıları vardır Yani bu rekor daha sonra std :: dizide veri üyesi var. std::array
'un veri üyesi bir topluluğa karşılık gelmektedir. Bunun için bir başlatıcı listesi vermelisiniz.
Yani rekor daha net olurdu için veri üyesi toplamıdır olarak, başlatma şu şekilde
std::array<std::pair<int, int>, 2> ids = { /* an initializer for data member of the array */ };
sonra
yazmak için gelmiş hayal
std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };
benzeyecek
std::array<std::pair<int, int>, 2> ids = { { /* initializers for the aggregate data member*/ } };
Ve nihayet
std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };
Bu, Joachim'in yanıtına 'std :: make_pair' kullanarak bakana kadar her şeyi açıklıyor gibi görünüyor. _that_, ek bir çift parantez olmadan nasıl çalışır? – TonyK
@TonyK Genel olarak, diş telleri ihmal edilebilir. int [2] [2] = {0, 1, 2, 3}; 'mükemmel bir şekilde geçerlidir. Ancak, kullanıcı tarafından sağlanan kurucularla sınıflarla uğraşırken, işler biraz zorlaşır: '{0, 1}', ilk öğeyi veya ilk alt öğeyi başlatma girişiminde bulunabilir. Belirsizlik ilk unsur lehine çözüldü. Öte yandan, make_pair'in sonucu sadece ilk alt elemanı başlatmak için kullanılabilir. – hvd
Çalışmak için standardın garanti ettiği tek şey "dizi a = {initializer-list};" Burada * başlatıcı listesi *, türleri "T" ye dönüştürülebilen "N" öğelerine kadar virgülle ayrılmış bir liste ". Ekstra parantez çifti muhtemelen mevcut tüm uygulamalarda çalışacaktır, ancak garanti edilmez. –