我们如何在const-member函数中调用“delete this;”?

时间:2011-02-28 23:08:21

标签: c++ delete-operator const-correctness

我看到了以下代码段:

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'?

4 个答案:

答案 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的概念是值得怀疑的。