新表达的评价顺序?

时间:2009-03-15 19:27:36

标签: c++

在下面的代码示例中,C ++标准是否保证在内存分配(调用operator new)之后但在调用X的构造函数之前评估'++ i'?

new X( ++i )

5 个答案:

答案 0 :(得分:12)

来自我的n2798副本:

  

5.3.4新

     

21是否在评估构造函数参数之前或在评估构造函数参数之后但在输入构造函数之前调用了分配函数是未指定的。如果分配函数返回空指针或使用异常退出,还是未指定是否计算构造函数的参数。

与(避免含糊不清)一起阅读:

  

5.3.4新

     

8 new-expression通过调用分配函数(3.7.4.1)获取对象的存储空间。如果newexpression通过抛出异常终止,它可以通过调用释放函数来释放存储(3.7.4.2)。如果分配的类型是非数组类型,则分配函数的名称为operator new,释放函数的名称为operator delete。如果分配的类型是数组类型,则分配   函数的名称是operator new [],deallocation函数的名称是operator delete []。 [...]

这几乎回答了这个问题。答案是'不'。

答案 1 :(得分:4)

通常,C ++编译器可以自由地重新排序函数参数,只要它不改变含义即可。

请参阅Martin的答案:What are all the common undefined behaviours that a C++ programmer should know about?

实际上,这里有2个函数调用。

  1. operator new
  2. 构造函数调用X
  3. 即使是两个单独的调用,我也不相信这两个操作之间存在序列点。维基百科似乎support this point。因此,编译器可以根据需要自由重新排序评估。

答案 2 :(得分:2)

总之,没有。

“new”和“++ i”之间没有序列点

答案 3 :(得分:1)

++我应该在分配和调用之前执行。

编辑:(我可能回答得太快了)

答案 4 :(得分:1)

new X(++ i)

new operator wrt C ++标准的语法:

[::]“new”[“(”expression-list“)”] {new-type-id | “(”type-id“)”} [“(”表达式列表“)”]

所以,

  1. 为对象X分配内存。
  2. 表达式列表将被评估为传递给已分配对象的构造函数。
  3. 所以,我们可以肯定,在调用Object X的构造函数之前,将对++ i进行求值。

    干杯..