私有继承C++11中聚合类的类的聚合初始化
Aggregate initialization of a class that privately inherits an aggregate class in C++11
考虑以下代码:
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
。
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 为什么除了继承聚合结构之外,结构为空,无法聚合初始化?
- 初始化依赖于子类的继承类的常量类成员
- C++ 初始化继承的模板基类
- 使用继承初始化C++中的参数
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 继承的构造函数忽略类内初始化
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 跨继承树初始化元组
- 与lambda一起使用虚拟继承在初始化列表中捕获此问题的GCC错误
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 如何在派生类中初始化继承的模板POD结构
- 我如何避免明确构建C 初始化列表中继承的所有内容
- 使用从另一个类继承的类的对象初始化成员对象
- 正确的语法,用于在C 中继承,并具有初始化列表和内存分配
- 构造函数继承和直接成员初始化
- 继承构造函数不允许类似数组的初始化
- valgrind 在使用 std::make_shared 和虚拟继承时报告的未初始化值
- 初始化继承的成员数据
- 如何初始化继承类的静态变量