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