为什么在使用堆叠 std::array 声明多维数组时需要"双括号"?

Why are "double braces" needed in declaration of multi-dimensional array using stacked std::array?

本文关键字:数组 声明 array std 为什么      更新时间:2023-10-16
#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} }
};

,尽管只有这样的单括号可以逃脱所有括号业务:

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

我想知道为什么需要{{,除了使用堆叠的std :: array时最低维度?

godbolt.org/g/b6qfn4

外括号是汇总初始化器语法,并且内部为阵列初始化器语法。

C 14允许 Brace Elision 。确保您使用C 14或更高。

您的类型arr_tarr2d_tarr3d_tcarr3d_t是聚合类型。它们是聚合类型,因为std ::数组本身是一种聚合类型。它们的对象是使用聚合初始化初始化的,在用C 11支持时,您需要(额外的){}括号围绕嵌套初始化器(S)。从C 14标准开始:

可以将嵌套初始化器列表周围的牙套放在(省略)