请考虑以下代码:
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
?
答案 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
。