2017-12-15 184 views
7
#include <array> 
using std::array; 

constexpr auto d1=2; 
constexpr auto d2=3; 
constexpr auto d3=4; 

// stacked std::array 
using arr_t = array<int,d1>; 
using arr2d_t = array<arr_t,d2>; 
using arr3d_t = array<arr2d_t,d3>; 
constexpr arr3d_t arr1 = {{ 
    {{ {1,2}, {3,4}, {5,6} }}, 
    {{ {1,2}, {3,4}, {5,6} }}, 
    {{ {1,2}, {3,4}, {5,6} }}, 
    {{ {1,2}, {3,4}, {5,6} }} 
}}; 

// built-in array 
using carr3d_t = int[d3][d2][d1]; 
constexpr carr3d_t arr2 = { 
    { {1,2}, {3,4}, {5,6} }, 
    { {1,2}, {3,4}, {5,6} }, 
    { {1,2}, {3,4}, {5,6} }, 
    { {1,2}, {3,4}, {5,6} } 
}; 

: {{ düşük boyut hariç gereklidir neden yığılmış std kullanırkenYığılmış std :: array kullanılarak çok boyutlu dizinin bildirilmesinde neden "çift parantez" gerekir? kimse bu gibi tek parantez tek çifti ile tüm parantez iş yok alabilirsiniz rağmen

// getaway with one-dimensional declaration 
constexpr arr3d_t arr3 = { 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6 
}; 
constexpr carr3d_t arr4 = { 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6 
}; 
İsterdim

bilmek ::dizi?

godbolt.org/g/b6qfn4

cevap

3

Sizin tipleri arr_t, arr2d_t, arr3d_t ve carr3d_t agrega türleridir. Bunlar toplu türlerdir, çünkü std::array'un kendisi bir birleşik türüdür. Nesneleri, aggregate initialization kullanılarak başlatılır ve C++ 11 desteği ile derleme yaparken, iç içe başlatıcı (lar) ı çevreleyen (ekstra) {} parantezleri gerekir. C++ 14 standardı ile başlayarak: iç içe başlatıcı listeleri yaklaşık

parantez elided edilebilir

+0

Hem clang hem de gcc'yi deniyorum, derleme yapmıyor. Bu, hepsi std :: array davası için C++ 14 brace elision'ı seçmedikleri anlamına mı geliyor? [Godbolt.org/g/YWAbHo](https://gcc.godbolt.org/g/YWAbHo) – sandthorn

6

dış parantezler aggregate initializer syntax ve iç dizi başlatıcı dizimi olan (resmedilmemiş).

C++ 14, brace elision izin verir. C++ 14 veya daha iyisi ile derlediğinizden emin olun.