是否可以以某种方式使第二个实例化工作?我尝试过using
和= default
的组合,但无济于事。
struct A
{
int i;
};
struct B : A
{};
A a{11}; // This works.
B b{22}; // "No matching constructor".
答案 0 :(得分:4)
根据C ++ 2014标准(8.5.1聚合):
1聚合是一个没有用户提供的数组或类(第9节) 构造函数(12.1),没有私有或受保护的非静态数据成员 (第11条),没有基类(第10条),没有虚函数 (10.3)。
但是根据C ++ 2017标准(8.6.1聚合):
1聚合是一个带有
的数组或类(第9条)(1.1) - 没有用户提供的,显式的或继承的构造函数(12.1),
(1.2) - 没有私人或受保护的非静态数据成员(第11条),
(1.3) - 没有虚函数(10.3)和
(1.4) - 没有虚拟,私有或受保护的基类(10.1)。
正如您所看到的,C ++ 2017标准消除了聚合不具有基类的限制。因此,代码不会被不支持C ++ 2017标准的编译器编译。
您需要明确声明一个构造函数,该构造函数除了自己的类B
的参数外。
答案 1 :(得分:1)
这不是A
的构造函数。这是聚合初始化。
无论如何,你注定要失败。虽然B
是一个A
,但如果没有构造函数,则无法通过B
将初始化传递给A
。可能有一些伏都教和巫术使它看起来像是在初始化A
到B
,但最好只编写一些漂亮,干净的代码,如初始化的B
构造函数A
struct B : A
{
B(int val):A{val}
{
}
};
现在显然B
有一个构造函数和
B b{22};
有效。