聚合初始化是指聚合中的前一个元素吗?

时间:2014-01-25 18:29:10

标签: c++ language-lawyer

以下是否合法?

class Aggregate {
public:
    int a;
    int b;
};

class Class {
public:
    Class():
        m_aggregate{
            3,
            // Here, m_aggregate.a is fully constructed, but m_aggregate is not
            m_aggregate.a + 5
        } {
    }
    Aggregate m_aggregate;
};

在生命周期开始之后,但在整个聚合的构造函数完成之前使用聚合的元素是否合法?

使用gcc 4.8.2进行测试似乎行为正确......

1 个答案:

答案 0 :(得分:5)

我认为这不合法。确实,支撑列表的元素按顺序初始化(即列表元素的评估是有序的,参见8.5.4 / 4),但聚合仅在列表之后构建完全建成。参看8.5.1:

  

当初始化程序列表初始化聚合时,如8.5.4中所述,初始化程序列表的元素将作为聚合成员的初始化程序,增加下标或成员顺序。每个成员都从相应的初始化子句复制初始化。

为了从某些东西进行复制初始化,原始需要先存在。