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

Dav*_*one 3 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;
};
Run Code Online (Sandbox Code Playgroud)

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

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

Ker*_* SB 5

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

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

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