1

考虑以下代码:

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通过聚合初始化来初始化?

4

1 回答 1

9

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

由于不是聚合,所以不能用聚合初始化来初始化。

最明显的解决方法可能是添加一个ctor到基础,并让 ctorderived将参数传递给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此处使用 an 的方法 -std::array没有任何东西可以接受initializer_list.

于 2013-08-06T03:38:24.427 回答