我从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中是否已更改?
答案 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)