说我有以下内容:
struct A
{
int x;
};
//...
A* aOriginal = new A(); //value construct aOriginal
assert( aOriginal->x == 0 );
A* aSecond = new (aOriginal) A;
assert( aSecond->x == 0 );
第二个断言是否保证保持,即使aSecond
未进行值初始化?从逻辑上讲,它应该是,因为内存没有被覆盖,但它是由标准指定的吗?
答案 0 :(得分:9)
没有
在同一存储位置构造第二个对象时,前一个对象的生命周期结束(§3.8/ 1):
[...]类型
T
的对象的生命周期在以下时间结束:
- 如果
T
是具有非平凡析构函数的类类型(第12.4节),则析构函数调用将启动,或者- 对象占用的存储空间被重用或释放。
创建第二个对象时,由于A
具有隐式默认构造函数,x
成员默认初始化,因此不执行初始化(§8.5/ 6):
默认初始化
T
类型的对象意味着:
[...]
否则,不执行初始化。
这意味着该对象具有不确定的值(§5.3.4/ 15):
创建类型为
T
的对象的 new-expression 按如下方式初始化该对象:
- 如果省略 new-initializer ,则对象默认初始化(§8.5);如果没有执行初始化, 该对象具有不确定的价值。
如果您认为该值不是不确定的,因为您之前已在该存储位置初始化了另一个对象:该标准通过说明前一个对象的属性在其生命周期结束后不再适用而丢弃该可能性(§3.8) / 3):
本国际标准中归属于对象的属性仅适用于给定对象的生命周期。