C++ 过去删除指向const的指针的行为是否发生了变化?

C++ 过去删除指向const的指针的行为是否发生了变化?,c++,visual-studio,visual-c++,constants,delete-operator,C++,Visual Studio,Visual C++,Constants,Delete Operator,我从中获得了以下测试代码: 在那个页面上,微软声称不允许删除指向const的指针,这在我看来是合乎逻辑的。您不希望给const一个指针的函数在背后删除实例 奇怪的是,这个问题表明这是允许的,甚至是有道理的 事实上,如果我使用VisualStudio2010从MSDN页面编译代码,它会正确编译(即使使用/W4编译时没有警告) 是C++中删除过去指针不变的行为吗?或者这是在Visual Studio中更改的?您被允许删除指向const的指针,而Microsoft以前显然犯了错误。据我所知,标准从未改

我从中获得了以下测试代码:

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

奇怪的是,这个问题表明这是允许的,甚至是有道理的

事实上,如果我使用VisualStudio2010从MSDN页面编译代码,它会正确编译(即使使用/W4编译时没有警告)


是C++中删除过去指针不变的行为吗?或者这是在Visual Studio中更改的?

您被允许删除指向const的指针,而Microsoft以前显然犯了错误。据我所知,标准从未改变

毫无疑问,有抄本的人会引用章节和诗句(并因此获得很大的声誉)


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

您确实可以
删除
指向-
常量的指针

如果Visual C++对标准一致的程序表示不同,那么这就是<>强>编译器错误>,应报告。

<>你的(或者微软的?)程序不是标准C++,但是,因为你有<代码>无效>代码>结果类型为<代码>主< /代码> .< 您链接到的知识库文章说“定义上不允许删除指向常量的指针(ARM第5.3.4节)”,尽管这是错误的,但它给出的参考是正确的。ARM第5.3.4节规定“不能删除指向常数的指针”。然而,ARM是在1990年出版的

C++在十年后,1998标准化,标准C++中可以删除一个指针,代码。规范性文本中未对此作出规定;它是通过省略限制来指定的。但是,C++98标准§5.3.5/2有以下非规范性注释:

指向常量的指针可以是delete表达式的操作数;在指针表达式用作delete表达式的操作数之前,无需丢弃它的常量(5.2.11)

我们现在又是在标准化之后的十年多,在ARM之后的二十年多

<>你使用的是VisualC++的版本?

干杯&hth.,

请注意

注释:VisualC++ 没有在中演示此问题 与合同中所做变更的一致性 C++ ANSI标准


有趣 Solaris Studio 12 C++编译器遭受同样的错误,即它不允许删除指针到const。@帕特里克:不奇怪。例如,您可以执行
T const*p=new T const(42)
。为了支持初始化,在构造函数执行期间它是非常量的,然后打开常量。并且,如果没有执行强制转换,将保持非常
常量
,直到您
删除
,允许析构函数修改以进行清理。ARM时代最初不允许的理由是
delete
会改变对象。C++98视图更复杂,任何非常坚固和不变的房屋在建造和破坏过程中都会发生变化。。。干杯,这段代码在VC6上编译失败。然而,在VC9上,它编译得很好。所以我想这是VC6编译器的问题。VC6是在1998年发布的,比ISO C++98标准早了几个月。因此,它在这里遵循ARM并非完全不合理。@MSalters:再加上一个事实,那就是当时MS由于持续缺席标准化会议而失去了在标准化委员会的投票权。VC6在发布时就被破坏了。(标准当时已经是石头了,只需要正式手续,直到正式发布)。但是,自从(Heck,他们雇佣了前委员会主席),VC肯定已经转向了方向盘。VC已经变得更好了。这个“Visual C++网络编译器”现在被称为VC7.0,BTW.OOPS,我似乎忽略了这句话。谢谢。顺便说一下,一般来说,我不信任微软编译器。它已经有很多bug了!
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
   }