我可以通过其基本默认构造函数实例化一个结构吗?

时间:2017-06-14 00:37:35

标签: c++

是否可以以某种方式使第二个实例化工作?我尝试过using= default的组合,但无济于事。

struct A
{
    int i;
};

struct B : A
{};

A a{11}; // This works.
B b{22}; // "No matching constructor".

2 个答案:

答案 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。可能有一些伏都教和巫术使它看起来像是在初始化AB,但最好只编写一些漂亮,干净的代码,如初始化的B构造函数A

struct B : A
{
    B(int val):A{val}
    {
    }
};

现在显然B有一个构造函数和

B b{22};

有效。