具有struct和继承的初始化列表[duplicate]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我正在使用结构化的初始化列表。但是,它不适用于继承。

这段代码很好。

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++ inheritance struct initialization initializer-list
2个回答
3
投票

您的代码适用于C ++ 17。从C ++ 17开始,LY都被认为是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)),则可以省略(省略)嵌套初始化列表周围的大括号,在这种情况下,根据需要使用许多初始化子句来初始化每个成员或相应的子聚合的元素,以及后续的初始化子句用于初始化对象的以下成员。

LIVE

在C ++ 17之前,它不起作用,因为执行了list initialization,尝试使用适当的构造函数并失败。


2
投票

有没有办法使用带有继承结构的初始化列表。

如果使用正确的参数添加构造函数,则可以使用初始化列表。

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};
© www.soinside.com 2019 - 2024. All rights reserved.