如何通过初始化列表初始化嵌套(2D)std::array
?
template <std::size_t W, std::size_t H>
class Block
{
std::array<std::array<int, W>, H> block;
public:
template <typename ...E>
Block(E&&...e) : block {{std::forward<E>(e)...}} {}
};
班级Block
应该能够初始化block
成员,如下所示:
Block<3, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
注意:我们可以直接在C ++ 11中初始化std::array
:
std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
我正在使用gcc-4.9.0
答案 0 :(得分:5)
当涉及到嵌套结构时,大括号的规则非常复杂。
代码中最简单的形式是:
Block<3, 2> b {1, 2, 3, 4, 5, 6};
这基本上省略了所有内部括号 - 语言允许这些遗漏。
下一个语法稍微复杂一点:
Block<3, 2> b {{1, 2, 3, 4, 5, 6}};
它仍然省略了大括号,但就Block
而言,就其成员而言,它是完全支撑的。它省略了array
及其成员的大括号。
这一个完全支持:
Block<3, 2> b {{{ {{1, 2,3}}, {{4,5,6}} }}};
支持所有内部结构。
有关详细说明,请参阅我的其他答案:
答案 1 :(得分:1)
标准的解释可能与初始化std::array
所需的括号数量过于反复无常有关。这个完全支持的版本在GCC 4.8.1上编译没有问题:
Block<3, 2> b {
{
{
{ {1, 2, 3} }, { {4, 5, 6} }
}
}
};
奇怪的是,这个版本也编译了:
Block<3, 2> b {
{{ {1, 2, 3}, {4, 5, 6} } }
};