这个问题在这里已有答案:
我正在使用结构化的初始化列表。但是,它不适用于继承。
这段代码很好。
struct K {
int x, y;
};
K k {1, 2};
但是,这会产生错误。
struct L : public K {};
L l {1, 2};
此外,这不起作用。
struct X {
int x;
};
struct Y : public X {
int y;
};
Y y {1, 2};
有没有办法使用带有继承结构的初始化列表。我在模板中使用它们,因此如果它是一个继承的类,它就不会编译。
您的代码适用于C ++ 17。从C ++ 17开始,L
和Y
都被认为是aggregate type:
没有
virtual, private, or protected (since C++17)
基类
然后允许brace elision;即子集合的嵌套初始化列表周围的大括号可以省略,然后你可以写L l {1, 2};
和Y y {1, 2};
(而不是L l {{1, 2}};
和Y y {{1}, 2};
)。
如果聚合初始化使用
copy- (until C++14)
list-initialization语法(T a = {args ..}or T a {args..} (since C++14)
),则可以省略(省略)嵌套初始化列表周围的大括号,在这种情况下,根据需要使用许多初始化子句来初始化每个成员或相应的子聚合的元素,以及后续的初始化子句用于初始化对象的以下成员。
在C ++ 17之前,它不起作用,因为执行了list initialization,尝试使用适当的构造函数并失败。
有没有办法使用带有继承结构的初始化列表。
如果使用正确的参数添加构造函数,则可以使用初始化列表。
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};