【问题标题】:Why are "double braces" needed in declaration of multi-dimensional array using stacked std::array?为什么在使用堆叠 std::array 声明多维数组时需要“双括号”?
【发布时间】:2018-05-30 01:13:33
【问题描述】:
#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++ arrays c++11 stdarray


    【解决方案1】:

    外大括号是aggregate initializer syntax,内大括号是数组初始化语法。

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

    【讨论】:

      【解决方案2】:

      您的类型 arr_tarr2d_tarr3d_tcarr3d_t 是聚合类型。它们是聚合类型,因为 std::array 本身就是聚合类型。它们的对象是使用aggregate initialization 初始化的,并且在使用 C++11 支持进行编译时,您需要(额外的){} 大括号包围嵌套的初始化程序。从 C++14 标准开始:

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

      【讨论】:

      • 我尝试了clang和gcc,它没有编译。这意味着他们都没有为 std::array 案例选择 c++14 大括号省略吗? godbolt.org/g/YWAbHo
      猜你喜欢
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多