从 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;
};
如果我尝试编译
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;
};