【问题标题】:Designated initialization and base classes?指定初始化和基类?
【发布时间】:2020-08-22 19:28:51
【问题描述】:

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

struct B { int mb; };
struct D : B { int md; };

这六个表达式中哪些是非良构的,哪些不是?

/*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}

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

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

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

    (3) 和 (4) 将指定初始化器与非指定初始化器混合使用,这是不允许的。 designated-initializer-list 的语法只允许 designated-initializer-clause,它是一个 designator (. identifier),后跟一个 brace-or-equal-initializer。没有其他形式。

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

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


    proposal 清楚地表明这两者都是有意的。它满足:

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

    和:

    要么所有的指示符,要么没有。

    未来的问题:

    我们是否允许指定列表作为后缀出现在列表初始化器中,例如​A { 1, 2, .c= 3, .d = 4 }​?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多