考虑以下代码行:
new (p++) T();
如果构造函数T()
抛出异常,是否p
保证已经自增?
考虑以下代码行:
new (p++) T();
如果构造函数T()
抛出异常,是否p
保证已经自增?
从 5.3.4 [expr.new] 开始(引自 n3242):
11 new-placement 语法用于为分配函数提供附加参数。如果使用,则在通过组装由请求的空间量(第一个参数)和 new-expression 的 new-placement 部分中的表达式(第二个和后续参数)组成的参数列表创建的函数调用上执行重载决议.
所以在一个新的表达式中,分配函数是从函数调用中使用的(这是有道理的)。所有分配函数都是函数,包括实现提供的函数,来自 3.7.4.1 [basic.stc.dynamic.allocation]:
1分配函数应为类成员函数或全局函数;[...]
因此,当构造函数抛出异常时,分配已经发生并且相关的函数调用表达式已经被完全评估。
是的,它保证会增加。
运算符只是函数/方法调用的语法糖。
我不相信 new 在运算符之上有任何特殊含义,所以它应该是相同的。
因此,在调用函数之前,所有参数都被完全评估(带有序列点)new
。
我不认为标准直接/明确地回答了这个问题。然而,隐含的答案是肯定的。
特别是,new 的放置语法只是一种指定将传递给函数的额外参数的方法。与任何其他函数调用一样,在评估函数的所有参数(以未指定的顺序)和执行函数中的任何代码之间存在一个序列点。我相信这应该意味着您的p++
意愿会被评估,并且在其他任何事情发生之前应用所有副作用。
放置 new 只是一个常规函数,名为operator new(size_t, void*)
. 它只是返回它的第二个参数。
增量运算符执行以下操作:
所以,p
保证是递增的。