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

Initialize a private aggregate from a braced-init-list

如果我尝试编译

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

triangle const unit_triangle{ { { { 0, 0 }, { 1, 0 }, { 0, 1 } } } };

我收到错误消息

cannot convert from 'initializer list' to 'triangle'.

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

拥有 private 成员可以防止 triangle 成为 aggregate。它是一个集合,允许您在 triangle 没有构造函数的情况下列表初始化 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;
};