7

如何std::array通过初始化列表初始化嵌套(2D)?

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

注意:我们可以std::array直接在 C++11 中初始化:

std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }};

我正在使用 gcc-4.9.0

4

2 回答 2

6

当涉及到嵌套结构时,大括号的规则非常复杂。

您的代码中最简单的形式是:

Block<3, 2> b {1, 2, 3, 4, 5, 6};

这基本上省略了所有的内括号——这些省略是语言允许的。

下一个稍微复杂的语法是:

Block<3, 2> b {{1, 2, 3, 4, 5, 6}};

它仍然省略了大括号,但就Block其成员而言,它是完全大括号的。它省略了 thearray及其成员的大括号。

而这个是完全支撑的:

Block<3, 2> b {{{ {{1, 2,3}}, {{4,5,6}} }}}; 

它支持所有内部结构。

所有表格都编译得很好

详细解释见我的另一个答案:

于 2013-11-03T19:05:01.533 回答
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} } }
                };
于 2013-11-03T19:05:17.107 回答