从braced-init-list初始化私有聚合

时间:2017-03-21 20:15:25

标签: 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 } } } };

我收到错误消息

  

无法从“初始化列表”转换为“三角形”。

如果我将private替换为public,则代码会成功编译。因为我不想这样做:如果我想从braced-init-list初始化unit_triangle,我需要做什么?

1 个答案:

答案 0 :(得分:3)

拥有private成员会阻止triangle成为aggregate。它是一个聚合,允许您列出初始化triangletriangle没有构造函数。这就是为什么当您将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;
};