具有结构和继承的初始化列表

Moc*_*han 1 c++ inheritance struct initialization initializer-list

我正在为结构使用初始值设定项列表。但是,它不适用于继承。

这段代码很好。

struct K {
int x, y;
};

K k {1, 2};
Run Code Online (Sandbox Code Playgroud)

但是,这会产生错误。

struct L : public K {};
L l {1, 2};
Run Code Online (Sandbox Code Playgroud)

此外,这不起作用。

struct X {
    int x;
};

struct Y : public X {
    int y;
};

Y y {1, 2};
Run Code Online (Sandbox Code Playgroud)

有没有办法使用具有继承结构的初始化列表。我在模板中使用它们,因此无论它是否是继承类,它都不会编译。

son*_*yao 5

您的代码适用于 C++17。由于 C++17LY都被视为聚合类型

没有virtual, private, or protected (since C++17)基类

然后允许大括号省略;即子聚合的嵌套初始化列表周围的大括号可以被省略,然后你可以只写L l {1, 2};and Y y {1, 2};(而不是L l {{1, 2}};and Y y {{1}, 2};)。

如果聚合初始化使用copy- (until C++14)列表初始化语法(T a = {args..} or T a {args..} (since C++14)),则嵌套初始化列表周围的大括号可能会被省略(省略),在这种情况下,根据需要使用尽可能多的初始化子句来初始化每个成员或对应子聚合的元素,后续的初始化子句用于初始化对象的以下成员。

居住

在 C++17 之前它不起作用,因为执行列表初始化,尝试使用适当的构造函数并失败。