我希望能够在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,因为那样我将需要通过我不想使用的双点或三点来调用参数,因为所有成员都是同等重要的,并且看起来不好看。
答案 0 :(得分:4)
从C ++ 17开始,您希望使用的语法是有效的:
const auto data3 = DataThree{1, 2, 3, 4, 5, 6, 7};
在此之前,根据[dcl.init.aggr]/1
,聚合初始化将是非法的:
集合是没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(条款10),没有虚函数(10.3)。