C++ 从带括号的初始化列表初始化私有聚合

C++ 从带括号的初始化列表初始化私有聚合,c++,aggregate,c++14,list-initialization,C++,Aggregate,C++14,List Initialization,如果我试图编译 class triangle { private: std::array<std::array<double, 2>, 3> m_vertices; }; triangle const unit_triangle{ { { { 0, 0 }, { 1, 0 }, { 0, 1 } } } }; 类三角形 { 私人: std::数组m_顶点; }; 三角形常数单元{{{{0,0},{1,0},{0,1}}; 我收到了错误信息 无法从“初始值设定

如果我试图编译

class triangle
{
private:
    std::array<std::array<double, 2>, 3> m_vertices;
};

triangle const unit_triangle{ { { { 0, 0 }, { 1, 0 }, { 0, 1 } } } };
类三角形
{
私人:
std::数组m_顶点;
};
三角形常数单元{{{{0,0},{1,0},{0,1}};
我收到了错误信息

无法从“初始值设定项列表”转换为“三角形”


如果将
private
替换为
public
,则代码编译成功。既然我不想这样做:如果我想从带括号的init列表中初始化
unit\u triangle
,我需要做什么?

拥有
private
成员可以防止
triangle
成为。它是一个聚合,允许您列出初始化
三角形
,而
三角形
没有构造函数。这就是为什么将
private
替换为
public
时它会起作用

要支持所需的语法,只需添加适当的构造函数。在这种情况下:

class triangle
{
public:
    triangle(std::array<std::array<double, 2>, 3> const& v)
        : m_vertices(v)
    { }

private:
    std::array<std::array<double, 2>, 3> m_vertices;
};
类三角形
{
公众:
三角形(标准::数组常量和v)
:m_顶点(v)
{ }
私人:
std::数组m_顶点;
};