初始化列表,用于初始化2D std :: array成员

时间:2013-11-03 18:50:31

标签: c++ arrays c++11

如何通过初始化列表初始化嵌套(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

2 个答案:

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

支持所有内部结构。

All forms compiles fine

有关详细说明,请参阅我的其他答案:

答案 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} } }
                };
相关问题