std::array
是有點怪。它沒有用戶定義的構造函數,所以它很像一個普通的結構體。所以std::array<float,2>
很像
struct two_floats {
float array[2];
};
正因爲如此,如果你初始化一個,你會在邏輯上做這樣的:
two_floats x = {{1,2}};
std::array<float,2> y = {{1,2}};
外括號是對結構本身和內部括號爲結構的內容。
它發生在工作,只提供一組括號:
two_floats x = {1,2};
但是,這是由於在C++中一個特殊的規則,允許括號在某些情況下可以省略。類似於您如何初始化一個二維數組,只有一組括號:
float x[2][2] = {1,2,3,4};
這就是當你初始化你這樣的範圍內所發生的事情:
Range r({1, 2});
即相當於
std::array<float,2> arg = {1,2}; // one set of braces omittted
Range r(arg);
但是這將更加明確地寫爲:
std::array<float,2> arg = {{1,2}};
Range r(arg);
初始化框時
類似的事情發生。如果我們明確地寫出來的初始化它應該是這樣的:
std::array<float,2> box_arg1 = {{1,2}};
std::array<float,2> box_arg2 = {{3,4}};
std::array<float,2> box_arg3 = {{5,6}};
std::array<Range,3> box_args = {{box_arg1,box_arg2,box_arg3}};
Box b(box_args);
因此,如果我們代替初始化,我們得到:
Box b({{{{1,2}},{{3,4}},{{5,6}}}});
和工程。但它很醜陋。這個初始化過於複雜,不允許在這裏省略額外的大括號,這是您遇到的問題。
的一種方法來解決此提供一種採取單獨的數組元素的附加構造。
class Range
{
public:
Range(float x,float y) : m_ends{x,y} { }
Range(std::array<float, 2> ends) : m_ends(ends) {}
private:
std::array<float, 2> m_ends;
};
class Box
{
public:
Box(Range x,Range y,Range z) : m_ranges{x,y,z} {}
Box(std::array<Range, 3> ranges) : m_ranges(ranges) {}
private:
std::array<Range, 3> m_ranges;
};
,現在您可以初始化你的盒子就像你本來想:
Box b({{1,2}, {3,4}, {5,6}});
這工作:'盒子B {{{{{1,2}},{{3,4}}, {{5,6}}}}}'。 – user1887915