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

Pat*_*ick 7 c++ const visual-studio visual-c++ 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
   }
Run Code Online (Sandbox Code Playgroud)

在那个页面上,微软声称不允许删除指向const的指针,这对我来说似乎是合乎逻辑的.你不希望你给指针指向const的函数删除你背后的实例.

奇怪的是,问题删除指向const(T const*)的指针表明它是允许的,它甚至是有意义的.

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

关于删除指针到const的行为过去是否在C++标准中发生了变化?或者Visual Studio中是否更改了?

Che*_*Alf 12

你确实delete可以指向指针const.

如果Visual C++对符合标准的程序另有说明,那么这就是编译器错误,应该报告.

但是,你的(或微软?)程序不是标准的C++,因为你有void结果类型main.

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

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

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

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

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

干杯&hth.,

  • @Patrick:没那么奇怪.例如,你可以做`T const*p = new T const(42)`.为了支持初始化,它在构造函数执行期间是非`constst`,然后转为`const`.并且,如果没有进行转换,则保持非常"常量"直到你"删除",其中允许析构函数进行修改以进行清理.原来ARM时代禁止的理由是`delete`会改变对象.C++ 98视图更复杂,任何非常坚固和不变的房子在施工期间和破坏期间都会发生变化......干杯, (2认同)
  • 此代码在VC6上编译失败.但是在VC9上它编译得很好.所以我猜这是VC6编译器的一个问题. (2认同)
  • VC6于1998年发布,比ISO C++ 98标准早几个月.因此,在这里遵循ARM并不是不合理的. (2认同)