2017-12-15 5 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} } 
}; 

는 : {{이 가장 낮은 차원에서 제외해야하는 이유 스택 표준을 사용하는 경우누적 된 std :: array를 사용하여 다차원 배열 선언시 "이중 중괄호"가 필요한 이유는 무엇입니까? 하나는 이와 같은 단일 치아 교정기의 쌍 모든 중괄호 사업을 멀리 얻을 수 있지만

// 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 
}; 
내가 좋아하는 것

는 알고 ::정렬?

godbolt.org/g/b6qfn4

답변

3

귀하의 유형 arr_t, arr2d_t, arr3d_tcarr3d_t 집계 유형입니다. std::array 자체가 집계 유형이기 때문에 집계 유형입니다. 객체는 aggregate initialization으로 초기화되고 C++ 11 지원으로 컴파일 할 때는 중첩 된 이니셜 라이저를 둘러싼 중괄호 ({})가 필요합니다. 는 C++ 14 표준 출발 : 중첩 초기화리스트 주위

괄호는 생략 될 수있다

+0

나는 clang과 gcc 모두 시도하지만 컴파일되지 않습니다. 이것은 그들이 모두 std :: array case에 대한 C++ 14 brace elision을 아직 선택하지 않았다는 것을 의미합니까? [godbolt.org/g/YWAbHo](https://gcc.godbolt.org/g/YWAbHo) – sandthorn

6

외부 중괄호 aggregate initializer syntax하고 내부 배열 초기화 구문됩니다 (생략).

C++ 14는 브레 이스 엘레멘트을 허용합니다. C++ 14 이상을 사용하여 컴파일해야합니다.