12

考虑以下代码行:

new (p++) T();

如果构造函数T()抛出异常,是否p保证已经自增?

4

5 回答 5

8

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

11 new-placement 语法用于为分配函数提供附加参数。如果使用,则在通过组装由请求的空间量(第一个参数)和 new-expression 的 new-placement 部分中的表达式(第二个和后续参数)组成的参数列表创建的函数调用上执行重载决议.

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

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

因此,当构造函数抛出异常时,分配已经发生并且相关的函数调用表达式已经被完全评估。

于 2011-06-27T18:16:13.687 回答
4

是的,它保证会增加。

运算符只是函数/方法调用的语法糖。
我不相信 new 在运算符之上有任何特殊含义,所以它应该是相同的。

因此,在调用函数之前,所有参数都被完全评估(带有序列点)new

于 2011-06-27T18:15:06.400 回答
3

我不认为标准直接/明确地回答了这个问题。然而,隐含的答案是肯定的。

特别是,new 的放置语法只是一种指定将传递给函数的额外参数的方法。与任何其他函数调用一样,在评估函数的所有参数(以未指定的顺序)和执行函数中的任何代码之间存在一个序列点。我相信这应该意味着您的p++意愿会被评估,并且在其他任何事情发生之前应用所有副作用。

于 2011-06-27T18:15:26.713 回答
0

放置 new 只是一个常规函数,名为operator new(size_t, void*). 它只是返回它的第二个参数。

于 2011-06-27T18:14:20.647 回答
-1

增量运算符执行以下操作:

  1. 将旧值存储在内部副本中
  2. 加一
  3. 返回旧值
  4. 删除旧值的副本

所以,p保证是递增的。

于 2011-06-27T18:07:31.917 回答