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

q09*_*987 4 c++ const-correctness delete-operator

我看到代码片段如下:

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();
};
Run Code Online (Sandbox Code Playgroud)

首先,我确信上面的类定义是正确的.这是我的问题,为什么我们可以像上面那样定义函数'destroy'?问的原因是为什么我们可以在const-member函数中修改'this'?

Jam*_*lis 10

这与以下工作相同:

const int* upn = new int();
delete upn;
Run Code Online (Sandbox Code Playgroud)

您可以delete指向const限定对象的指针.成员函数的const限定只意味着this有一个类型const UPNumber*.


Mat*_*lia 5

const应用于方法的限定符具有使this传递给它的const指针的效果;特别是,在您的情况下,它将是const UPNumber *.

尽管如此,这不是问题delete:实际上,您可以deleteconst指针上使用而无需强制转换任何内容,如 §5.3.5 ¶2 所述:

[注意:指向 const 类型的指针可以是删除表达式的操作数;在将指针表达式用作删除表达式的操作数之前,不必抛弃它的常量性 (5.2.11)。]

请注意,在标准完成之前,已经有很多关于这是否是一个好主意的讨论,因此一些未标准的编译器在尝试delete const指向指针时会发出错误。

允许这种行为背后的想法是,否则你将无法在delete const不使用const_cast; 的情况下处理对象。有关更多信息,请参阅此问题