【问题标题】:Can't initialize a struct using an initializer list if it inherits? [duplicate]如果继承,不能使用初始化列表初始化结构? [复制]
【发布时间】:2015-12-11 19:29:34
【问题描述】:

我对我写的这段 (C++14) 代码感到困惑:

struct B {};
struct C     { int m; };
struct D : B { int m; };

int main() {
    C c = { 1 }; // this works
    D d = { 1 }; // this doesn't work
}

我自己为D 编写构造函数很好,但我找不到一个很好的解释为什么结构D 不再可以用初始化列表初始化。我所做的只是让它继承自一个完全空的类——我想我以某种方式让它表现得不像结构。

我的编译器究竟如何以不同的方式处理结构 CD

【问题讨论】:

    标签: c++ inheritance struct aggregate-initialization


    【解决方案1】:

    它适用于C,因为它是aggregate,因此它使用aggregate initialization,但D 不是聚合,因为它有一个基类。您提到的明显解决方法是编写一个构造函数。

    这在草案 C++ 标准部分 8.5.1 Aggregates [dcl.init.aggr] 中有所涉及,重点是我的:

    聚合是一个数组或一个类(第 9 条),没有用户提供的构造函数(12.1),没有私有或 受保护的非静态数据成员(第 11 条),无基类(第 10 条),无虚函数 (10.3)。

    有一个建议:Extension to aggregate initialization 删除该限制。正如 chris 指出的那样,这已被 Evolution 工作组接受,但据我所知,现在也需要被 Core 接受。

    【讨论】:

    • 根据this trip report,该提案在科纳被接受。
    • @chris 我没有看到应用于最新草稿的更改,所以我不确定,尽管我想我记得读过它已从该旅行报告中被接受。
    • @chris 好的,现在我明白了。据我了解,它已被 EWG 接受。它现在必须先提交给 CWG,然后才能应用于标准草案。
    【解决方案2】:

    D 不再是聚合类型,因此无法直接使用初始化列表进行初始化。如果你提供了一个构造函数,那么它将起作用。

    struct B {};
    struct C     { int m; };
    struct D : B { int m; D(int m_) : m(m_) {} };
    
    int main() 
    {
        C c = { 1 }; // this works
        D d = { 1 }; // this works
    }
    

    Live Example

    【讨论】:

      【解决方案3】:

      struct c 是一个 POD,而 struct D 是一个对象。由于继承,类初始值设定项规则适用。

      【讨论】:

      • C 也是和对象。
      猜你喜欢
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2011-10-11
      • 1970-01-01
      • 2016-06-23
      相关资源
      最近更新 更多