可以汇总初始化是指汇总中的先前元素

Can aggregate initialization refer to a previous element in the aggregate?

本文关键字:元素 初始化      更新时间:2023-10-16

是以下合法吗?

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测试似乎正确地表现...

我不认为这是合法的。的确,按顺序初始化了支撑列表的元素(即,对列表元素的评估进行了测序,请参见8.5.4/4),但是汇总仅在之后构造被完全构造。参见8.5.1:

当通过8.5.4中指定的初始化列表初始化汇总时,初始化器列表的元素被作为汇总成员的初始化元素,以增加的下标或成员顺序。每个成员都是从相应的初始化器子句中复制的。

为了从某种事物中复制启动,原始需要首先存在。