我正在使用结构化的初始化列表。但是,它不适用于继承。
这段代码很好。
struct K {int x,y;};
K k {1,2};但是,这会产生错误。
struct L:public K {};二 {…
有没有办法使用带有继承结构的初始化列表。
如果使用正确的参数添加构造函数,则可以使用初始化列表。
struct K { int x, y; K(int x_, y_) : x(x_), y(y_) {} }; struct L : public K { L(int x_, y_) : K(x_, y_) {} }; K k {1, 2}; L l {1, 2};
您的代码适用于C ++ 17。既然C ++ 17都是 L 和 Y 被认为是 聚合类型 :
L
Y
没有 virtual, private, or protected (since C++17) 基类
virtual, private, or protected (since C++17)
然后 支撑省略 被允许;即,subaggregate的嵌套初始化程序列表周围的大括号可以省略,然后你可以写 L l {1, 2}; 和 Y y {1, 2}; (代替 L l {{1, 2}}; 和 Y y {{1}, 2}; )。
L l {1, 2};
Y y {1, 2};
L l {{1, 2}};
Y y {{1}, 2};
如果聚合初始化使用 copy- (until C++14) 列表初始化语法(T a = {args ..} or T a {args..} (since C++14) ),嵌套初始化程序列表周围的大括号可以省略(省略),在这种情况下,必要时使用许多初始化子句来初始化相应子集合的每个成员或元素,后续的初始化子句用于初始化以下成员对象。
copy- (until C++14)
or T a {args..} (since C++14)
生活
在C ++ 17之前它不起作用,因为 列表初始化 而是执行,尝试使用适当的构造函数并失败。