这个问题不同于:析构函数被认为是const函数吗?const引用和const指针上的new-expression和delete-expression删除指向const的指针(T const *)我写 …
调用 delete 在成员指针上释放指针的内存 指着 但是 不 改变指针本身。因此,它不会改变对象的按位内容,因此可以在a中完成 const 会员。
delete
const
C ++只关心按位const(调用方法的对象)。不是逻辑const。如果没有位 物体 改变,然后一切都很好 - 就C ++语言而言。确实如此 不 无论是否 合乎逻辑 更改对象的行为(例如,通过更改成员指针指向的内容)。这不是编译器检查的内容。
所以我认为 delete p; 可能会改变会员 p 的 rhs 虽然 rhs 是一个const引用。
delete p;
p
rhs
没有。 delete p; 不会改变 p 。失效不是修改。
无论如何,对一个对象有一个const引用( rhs )不以任何方式阻止被引用的对象形式被修改。它只是通过const引用来防止修改。在这种情况下,我们通过访问对象 this 这恰好是指向非const的指针,因此允许修改。
this
有人可能会坚持“渲染指针无效不是为了改变指针的值”,但我没有在标准中找到这样的陈述。
删除表达式的行为在[expr.delete]中指定。在该部分中没有提到操作数被修改。
变为无效的指定如下:
[basic.compound] ...当指示的存储达到其存储持续时间的末尾时,指针值变为无效...
[basic.compound]
...当指示的存储达到其存储持续时间的末尾时,指针值变为无效...
请注意,它是 的 值 强> 变得无效。指针仍然具有相同的值,因为指针未被修改。指针所具有的值仍然只是一个不再指向对象的值 - 它是无效的。
补充:我改变了 delete p; 至 delete rhs.p; ,但它仍然有效。为什么?
delete rhs.p;
答案2.从上一个问题不再适用,但答案1.确实如此。 delete rhs.p; 不修改 rhs.p 。
rhs.p