2014-12-27 35 views

cevap

17

Başka bir parantez çifti ekleyin.

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } }; 

std::array<T, N> tip T[N] bir eleman içeren bir agregat sınıftır. Genellikle, düz T[N] dizisiyle aynı şekilde başlatabilirsiniz, ancak birleşik olmayan öğe türüyle uğraşırken, daha açık olmanız gerekebilir.

+0

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

+0

@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

+0

Ç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. –

13

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 } } }; 
+2

sonra std :: array' yalnızca bir veri üyesi vardır 'hiçbir garantisi yoktur. –

+0

@ T.C. Bu bilgi olmadan diziyi doğru şekilde başlatamazsınız. En azından gösterim için standart dizi tanımında aşağıdaki veri elemanını içerir T elemleri [N]; –

+0

Standart, " a = {initializer-list} dizisi" dizisinin, başlatıcı listesinin "T" ye dönüştürülebilen her türden N öğesine kadar olması durumunda çalışacağını garanti eder. Yerleşik dizinin (eğer biri kullanılıyorsa - kullanmadan tüm gereklilikleri yerine getirmenin mümkün olup olmadığını bilmiyorum) tek veri üyesi olduğuna dair bir garanti yoktur. –