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

时间:2013-08-06 03:27:36

标签: c++ inheritance c++11 aggregate-initialization

请考虑以下代码:

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

1 个答案:

答案 0 :(得分:9)

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

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

最明显的解决方法可能是向{base}添加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