【发布时间】:2014-10-09 09:00:45
【问题描述】:
在 C++03 标准中,我看到了:
5.3.5 删除
2 如果操作数具有类类型,则通过调用上述转换函数将操作数转换为指针类型,并在本节的其余部分使用转换后的操作数代替原始操作数。 在任一备选方案中,如果
delete的操作数的值为空指针,则该操作无效。 在第一个备选方案(删除对象)中,delete的操作数应是指向非数组对象的指针或指向表示此类对象的基类(第 10 条)的子对象(1.8)的指针。如果不是,则行为未定义。在第二种选择(delete array)中,delete的操作数的值应该是从前一个数组 new-expression 产生的指针值。72)如果不是,则行为未定义。
在 C++11 标准草案 (N3337) 中,我看到:
5.3.5 删除
2 如果操作数具有类类型,则通过调用上述转换函数将操作数转换为指针类型,并在本节的其余部分使用转换后的操作数代替原始操作数。在第一种选择(删除对象)中,
delete的操作数的值可能是空指针值,指向由 a 创建的非数组对象的指针以前的 new-expression,或指向表示此类对象的基类的子对象 (1.8) 的指针(第 10 条)。如果不是,则行为未定义。在第二种选择(delete array)中,delete 的操作数的值可以是空指针值或从前一个数组new-expression 产生的指针值。如果不是,则行为未定义。
我已经强调了两个标准中的规范之间的差异。我觉得奇怪的是,2003 年的标准更强调必须如何处理 NULL 指针,而 2011 年的标准没有说明实现必须做什么。
-
C++11 标准的措辞在标准草案和实际标准之间是否发生了变化?如果有,怎么做?
-
如果标准草案的措辞在实际标准中保持不变,那么在 2003 年至 2011 年间将非常强烈的声明更改为几乎没有的理由是什么?
【问题讨论】:
标签: c++ c++11 language-lawyer c++03 delete-operator