获得存储是什么意思?

Kry*_*n S 5 c++ lifetime placement-new language-lawyer

[basic.indet] p1说:

获取自动或动态存储期限的对象的存储时,该对象具有不确定值,如果未对该对象进行初始化,则该对象将保留不确定值,直到该值被替换。

为对象获取存储究竟意味着什么?考虑这个代码片段:

int a = 0;
new (&a) int;
Run Code Online (Sandbox Code Playgroud)

new 表达式int创建的对象的存储是什么时候获取的?是在定义创建的原始对象的存储被获取时,还是在new-expression创建对象时获取?

(旁注:根据P0593,由于[basic.life] p4,这个新对象将具有不确定的值,但是,没有明确指定,除非在创建第二个对象时考虑获取存储空间)

编辑:这似乎是未答复的缺陷报告CWG 1997 的主题

Nic*_*las 1

其实,很简单。来自 [expr.new]/8:

new 表达式可以通过调用分配函数来获取对象的存储空间

Placement-new 是一个分配函数。它可能只返回与给定的指针相同的指针,但此过程仍然被视为“获取对象的存储空间”。该存储是 指向的存储&a。因此,它完全按照预期工作。当前正在使用的存储a正在被重用。因此,当前的a生命周期结束,新的int生命周期在同一存储中开始。

“获取对象的存储”并不意味着“让存储出现以前不存在的状态”。正如它所说的那样:获取一块存储空间以便将对象放在那里。这与简单地获取一块存储不同。该存储块可能已被其他某个对象使用,这是正交的。