使用堆叠的std::array声明多维数组时,为什么需要“双括号”?

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

尽管如此,我们可以只使用一对这样的单引号来避免所有括号的麻烦:
// 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
2个回答

6

外层大括号是聚合初始化语法,内层则是数组初始化语法。

C++14允许大括号省略。请确保您正在使用C++14或更高版本进行编译。


3
你的类型 arr_t, arr2d_t, arr3d_tcarr3d_t 是聚合类型。它们是聚合类型,因为 std::array 本身就是一个聚合类型。它们的对象使用聚合初始化进行初始化,并且在使用 C++11 支持编译时需要额外使用 {} 大括号来包围嵌套的初始化值。从 C++14 开始标准中:

嵌套的初始化列表周围的大括号可以省略(省略)


我尝试了clang和gcc,但它们都没有编译成功。这是否意味着它们都还没有为std :: array情况选择使用c++14花括号省略? godbolt.org/g/YWAbHo - sandthorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接