C++ 初始化2D std::数组成员的初始值设定项列表
如何通过初始值设定项列表初始化嵌套(2D)C++ 初始化2D std::数组成员的初始值设定项列表,c++,arrays,c++11,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>
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)...}} {}
};
注意:我们可以在C++11中直接初始化
std::array
:
std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
std::数组b{{{{1,2,3},{4,5,6};
我使用的是gcc-4.9.0大括号的规则在嵌套结构中非常复杂 代码中最简单的形式是:
Block<3, 2> b {1, 2, 3, 4, 5, 6};
它支撑所有内部结构
有关详细说明,请参见我的其他答案:
std::array
所需的大括号数量太多。此完全支持的版本在GCC 4.8.1上编译时没有问题:
Block<3, 2> b {
{
{
{ {1, 2, 3} }, { {4, 5, 6} }
}
}
};
块b{
{
{
{ {1, 2, 3} }, { {4, 5, 6} }
}
}
};
奇怪的是,这个版本也编译:
Block<3, 2> b {
{{ {1, 2, 3}, {4, 5, 6} } }
};
块b{
{{ {1, 2, 3}, {4, 5, 6} } }
};
@MM。没问题。这对我来说仍然没有任何意义。无论如何,我认为您的第一次尝试在C++14中应该是合法的。通过将block
设为私有并提供一个ctor,block
现在不再是一个集合。由于括号内的初始值设定项从来都不是从中推导出来的,因此对于Block
类型的对象,唯一有效的初始值设定项现在是Block b{1,2,3,4,5,6}
将其回滚到对答案有意义的修订版,然后问一个新问题。
Block<3, 2> b {{{ {{1, 2,3}}, {{4,5,6}} }}};
Block<3, 2> b {
{
{
{ {1, 2, 3} }, { {4, 5, 6} }
}
}
};
Block<3, 2> b {
{{ {1, 2, 3}, {4, 5, 6} } }
};