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

Mặc dù, người ta có thể thoát khỏi tất cả các doanh nghiệp niềng răng chỉ với cặp niềng răng đơn như thế này:Tại sao "dấu ngoặc kép" cần thiết trong khai báo mảng đa chiều bằng cách sử dụng xếp chồng lên nhau :: mảng?

// 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 
}; 

Tôi muốn biết tại sao {{ được yêu cầu ngoại trừ trên kích thước thấp nhất khi sử dụng std xếp chồng lên nhau ::mảng?

godbolt.org/g/b6qfn4

Trả lời

3

loại của bạn arr_t, arr2d_t, arr3d_tcarr3d_t là loại tổng hợp. Chúng là các loại tổng hợp vì chính bản thân số std::array là một loại tổng hợp. Các đối tượng của chúng được khởi tạo bằng cách sử dụng aggregate initialization và khi biên dịch với sự hỗ trợ C++ 11 bạn cần (thêm) {} dấu ngoặc ôm xung quanh (các) bộ khởi tạo lồng nhau. Bắt đầu với các tiêu chuẩn C++ 14:

dấu ngoặc xung quanh danh sách khởi tạo lồng nhau có thể được elided (bỏ qua)

+0

Tôi thử cả clang và gcc, nó không biên dịch. Điều này có nghĩa là tất cả họ không chọn C++ 14 brace elision cho std :: array case chưa? [godbolt.org/g/YWAbHo](https://gcc.godbolt.org/g/YWAbHo) – sandthorn

6

Các niềng răng bên ngoài là aggregate initializer syntax và bên trong là cú pháp mảng initializer.

C++ 14 cho phép cú đúp móc. Hãy chắc chắn rằng bạn đang biên dịch với C++ 14 hoặc tốt hơn.

Các vấn đề liên quan