私有继承C++11中聚合类的类的聚合初始化

Aggregate initialization of a class that privately inherits an aggregate class in C++11

本文关键字:初始化 继承 C++11      更新时间:2023-10-16

考虑以下代码:

struct base
{
    int x, y, z;
};
struct derived : private base
{
    using base::base;
};
int main(int argc, const char *argv[])
{
    base b{1, 2, 3}; // Allowed
    derived d{1, 2, 3}; // Not allowed
}

derived d{1, 2, 3};行使我的编译器(Clang 3.3)失败,并出现错误"没有用于初始化"派生"的匹配构造函数"。为什么会这样?有没有办法通过聚合初始化来初始化derived

derived有一个基类,所以它不是一个聚合(§8.5.1/1:"聚合是一个数组或一个没有基类[…]的类(第9条)")。

由于它不是聚合,因此无法使用聚合初始化对其进行初始化。

最明显的解决方法可能是将ctor添加到基中,并让derived的ctor将参数传递到base:

struct base
{
    int x, y, z;
    base(int x, int y, int z) : x(x), y(y), z(z) {}
};
struct derived : private base
{
    derived(int a, int b, int c) : base(a, b, c) {}
};
int main(int argc, const char *argv[])
{
    base b{1, 2, 3}; // Allowed
    derived d{1, 2, 3}; // Allowed
}

当然,如果您将base设置为保持聚合,那么这是不起作用的。

编辑:对于编辑后的问题,我看不出有什么方法可以在这里使用std::initializer_list——std::array没有任何东西可以接受initializer_list