placement-new是否会引入序列点?

fre*_*low 12 c++ constructor exception side-effects sequence-points

考虑以下代码行:

new (p++) T();
Run Code Online (Sandbox Code Playgroud)

如果构造函数T()抛出异常,p保证已经增加了吗?

Luc*_*ton 8

从5.3.4 [expr.new](引自n3242):

11 new-placement语法用于为分配函数提供其他参数.如果使用,则对通过组合参数列表创建的函数调用执行重载解析,该参数列表包括请求的空间量(第一个参数)和new-expression的新放置部分中的表达式(第二个和后续参数) .

所以在一个新表达式中,分配函数是从函数调用中使用的(这是有意义的).所有分配函数都是函数,包括实现提供的函数,来自3.7.4.1 [basic.stc.dynamic.allocation]:

1分配函数应是类成员函数或全局函数; [...]

因此,当从构造函数抛出异常时,已经进行了分配,并且已完全评估关联的函数调用表达式.