指定初始化和基类?

And*_*zos 6 c++ c++20

在C++20(最新草案)中,给出以下代码:

struct B { int mb; };
struct D : B { int md; };
Run Code Online (Sandbox Code Playgroud)

这六个表达式中哪些是格式错误的,哪些不是?

/*1*/ D{42, 43}
/*2*/ D{{42}, 43}
/*3*/ D{42, .md = 43}
/*4*/ D{{42}, .md = 43}
/*5*/ D{.mb = 42, .md = 43}
/*6*/ D{{.mb = 42}, .md = 43}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 6

(2) 是标准的、显式的聚合初始化。没关系。

\n

(1) 是在B子对象周围使用大括号省略的聚合初始化。这也好。

\n

(3) 和 (4) 将指定初始化器与非指定初始化器混合在一起,这是不允许的。指定初始值设定项列表的语法仅允许指定初始值设定项子句,它是一个指示符. 标识符)后跟一个大括号或等于初始值设定项。没有其他形式。

\n

(5)和(6)试图指定初始化一个基类子对象,这也是不允许的。所有指示符都必须命名直接非静态数据成员。[dcl.init.aggr]/3.1说:

\n
\n

如果初始化列表是指定初始化列表,则聚合应为类类型,每个指示符中的标识符应命名该类的直接非静态数据成员,[...]

\n
\n
\n

提案明确表明这两者都是有意的。它评论说:

\n
\n

基类对象将使用 {} 进行初始化。我们没有具体的用例来控制如何初始化基类对象,并且所提出的设计是前向兼容的,因此我们建议在另一个提案中解决这个问题。

\n
\n

和:

\n
\n

要么全部指示符,要么没有。

\n
\n

未来的问题:

\n
\n

我们是否允许指定列表作为后缀出现在 list\xc2\xad-initializer 中,例如\xe2\x80\x8bA { 1, 2, .c= 3, .d = 4 }\xe2\x80\x8b

\n
\n