C ++调用Struct及其继承的成员的默认构造函数

时间:2018-11-26 12:37:31

标签: c++ initialization c++14

我希望能够在C ++ 14中使用以下语法初始化对象:

const auto data1 = DataOne{1, 2, 3};
const auto data2 = DataTwo{1, 2, 3, 4, 5};
const auto data3 = DataThree{1, 2, 3, 4, 5, 6, 7};

哪个给我以下错误消息:

error msg `error: no matching function for call to ‘DataThree::DataThree(<brace-enclosed initializer list>)’`

类型定义为:

struct DataOne
{
    int a;
    int b;
    int c;
};

struct DataTwo : DataOne
{
    int d;
    int e;
};

struct DataThree : DataTwo
{
    int f;
    int g;
};

我不想在struct 方法中使用 struct,因为那样我将需要通过我不想使用的双点或三点来调用参数,因为所有成员都是同等重要的,并且看起来不好看。

1 个答案:

答案 0 :(得分:4)

从C ++ 17开始,您希望使用的语法是有效的:

const auto data3 = DataThree{1, 2, 3, 4, 5, 6, 7};

Live demo

在此之前,根据[dcl.init.aggr]/1,聚合初始化将是非法的:

  

集合是没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(条款10),没有虚函数(10.3)。