以下是否合法?
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进行测试似乎行为正确......
答案 0 :(得分:5)
我认为这不合法。确实,支撑列表的元素按顺序初始化(即列表元素的评估是有序的,参见8.5.4 / 4),但聚合仅在列表之后构建完全建成。参看8.5.1:
当初始化程序列表初始化聚合时,如8.5.4中所述,初始化程序列表的元素将作为聚合成员的初始化程序,增加下标或成员顺序。每个成员都从相应的初始化子句复制初始化。
为了从某些东西进行复制初始化,原始需要先存在。