我看到了以下代码段:
class UPNumber {
public:
UPNumber();
UPNumber(int initValue);
...
// pseudo-destructor (a const member function, because
// even const objects may be destroyed)
void destroy() const { delete this; } // why this line is correct???
...
private:
~UPNumber();
};
首先,我确信上面的类定义是正确的。 这是我的问题,为什么我们可以像上面那样定义函数'destroy'? 问的原因是为什么我们可以在const-member函数中修改'this'?
答案 0 :(得分:10)
这与这项工作的原因相同:
const int* upn = new int();
delete upn;
您可以delete
指向const限定对象的指针。成员函数的const限定只意味着this
具有类型const UPNumber*
。
答案 1 :(得分:4)
应用于方法的const
限定符具有使this
传递给它const
指针的效果;特别是在您的情况下,它将是const UPNumber *
。
但是,这对delete
来说不是问题:实际上你可以在delete
指针上使用const
而不必投射任何内容,如§5.3.5¶2所述:
[注意:指向const类型的指针可以是delete-expression的操作数;在将指针表达式用作delete-expression的操作数之前,不必丢弃指针表达式的constness(5.2.11)。 ]
请注意,在标准完成之前,已经有很多关于这是否是一个好主意的讨论,因此一些预标准编译器在尝试delete
{{1时会发出错误指针。
允许此行为背后的想法是,如果不使用const
,您将无法访问delete
const
个对象;有关详细信息,请参阅this question。
答案 2 :(得分:2)
您从哪里了解我们正在修改this
?实际上,this
不是左值。无论成员函数是否为const
,都无法修改。
将 delete-expression 应用于指针(任何指针,而不仅仅是this
)都不会被视为对该指针的修改。此外,delete-expression的参数被视为rvalue,这意味着它不可能被delete
修改。
因此,代码中delete
的应用程序没有问题。
答案 3 :(得分:0)
因为技术上可行并且已定义来调用delete this
provided that you are careful,“自杀”方法的常量技术上毫无意义,因为通话后不得触摸该物体。
这就是语义错误的原因,const
方法调用delete this
。
有趣的一点是Steve Jessep's comment。运行析构函数不会保持对象不变,因此应用 const ness的概念是值得怀疑的。