为什么“删除*这个”会编译?

时间:2016-04-18 11:25:06

标签: c++ compilation mfc

我从MFC CDialogEx中派生出一个类:

class MyDialog : public CDialogEx
{
  public:
    virtual void PostNcDestroy();
    …
  …
};

我实施了PostNcDestroy as such

void MyDialog::PostNcDestroy()
{
    CDialogEx::PostNcDestroy();
    delete *this; // oops, typo
}

我很惊讶地看到此代码编译(使用VC120或Visual Studio 2013),并且根本不会生成任何警告。谁能告诉为什么会这样呢?

谢谢。

2 个答案:

答案 0 :(得分:8)

这是一种隐含的转换;类CWnd具有operator HWND()转换函数,HWND是指针类型。

删除HWND是一个错误,但编译器并不知道并且无法警告您。

答案 1 :(得分:4)

  

为什么“删除*这个”会编译?

可以编写一个简单的mcve来重现你所询问的行为:

struct foo {
    operator int*() {
        return nullptr;
    }

    void bar() {
       delete *this; 
    }
};

int main() {
    foo f;
    f.bar();
}

这是编译因为foo可以隐式转换为指针类型。你班上的情况也是如此。