删除指针到const的行为是否在过去发生了变化?

时间:2011-01-28 09:45:32

标签: c++ visual-studio visual-c++ const delete-operator

我从http://support.microsoft.com/kb/131322获得了以下测试代码:

const int * pi   = new int(1000);
const char * pch = new char(65);

void main(void)
   {
   delete  pi  ;// Error C2710:cannot delete a pointer to a const object
   delete  pch ;// Error C2710:cannot delete a pointer to a const object
   }

在该页面上,Microsoft声称不允许删除指向const的指针,这对我来说似乎是合理的。你不希望你给指针指向const的函数删除你背后的实例。

奇怪的是,问题Deleting a pointer to const (T const*)表示它被允许,甚至是有道理的。

事实上,如果我使用Visual Studio 2010从MSDN页面编译代码,它会正确编译(使用/ W4编译时甚至没有警告)。

在C ++标准中,有关删除指针到const的行为是否已经改变了?或者在Visual Studio中是否已更改?

3 个答案:

答案 0 :(得分:12)

你确实delete指针指向 - const

如果Visual C ++对于符合标准的程序另有说法,那么这是一个编译器错误,应该报告。

您的(或Microsoft?)程序不是标准C ++,因为void的结果类型为main

您链接到的知识库文章说“定义不允许删除指向常量的指针(ARM部分5.3.4)”,虽然它是错误的,但它提供的引用是正确的。 ARM部分5.3.4说“无法删除指向常量的指针”。然而,ARM于1990年出版......

C ++在大约十年之后,1998年被标准化,在标准C ++中,您可以删除指向const的指针。这在规范性文本中没有规定;它是通过省略限制来指定的。但是,C ++ 98标准§5.3.5/ 2 具有以下非规范性注释

  

指向const类型的指针可以是 delete-expression 的操作数;在将指针表达式用作 delete-expression 的操作数之前,不必丢弃它的constness(5.2.11)。

在ARM标准化之后的十多年,我们已经过去十多年了。

您使用的是哪个版本的Visual C ++?

干杯&第h。,

答案 1 :(得分:2)

你可以删除一个指向const的指针,微软之前显然错了。据我所知,标准从未改变过。

毫无疑问,有副本的人会引用章节和经文(并获得一个大代表)。

main应该返回int,而不是void。

答案 2 :(得分:1)

另请注意,Microsoft link本身表示,

  

注意:Visual C ++ .NET编译器可以   没有证明这个问题   符合所做的改变   C ++ ANSI标准。

有趣!