c++ - 用于初始化 2D std::array 成员的初始化列表

标签 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

最佳答案

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

代码中最简单的形式是这样的:

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 .

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

关于c++ - 用于初始化 2D std::array 成员的初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19756652/

相关文章:

c++ - 这里发生了什么?我失去了常量吗?

c++ - 是否有与 GetLastInputInfo/LASTINPUTINFO 等效的 64 位?

c++ - 在 C++ 中设置差异

javascript - 有什么方法可以在 java 脚本中组合数组中的对以形成一个新数组

python - 高效地在多个维度上找到邻居并根据接近度计算值的总和

c++ - 如何将浮点值插入到 C++ 中的映射中?

c++ - Delphi 和 C/C++ DLL

c++ - Qt:QScriptValueIterator 有一个额外的元素

c++ - 数组索引循环变量在 C、C++ 中重置为零

c++ - 在 C++ 中为父类数据数组提供别名