在深入挖掘MFC的过程中,我找到了这段代码:
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
{ return this == NULL ? NULL : m_hWnd; }
似乎以这种方式使用。
CWnd *pWnd = nullptr;
pWnd->GetSafeHwnd(); // NULL
pWnd = /* something */;
pWnd->GetSafeHwnd(); // window handle
此时,我感到困惑 - 我们现在正在使用 NULL 对象调用成员函数!怎么可能是合法的C ++?
答案 0 :(得分:2)
就语言而言,这是最明确的未定义行为。 §9.3.1[class.mfct.non-static] / p2:
如果为对象调用类
X
的非静态成员函数 该行为不属于X
类型,也不属于X
类型 未定义。
据推测,编写此函数的人都知道微软的编译器在这种特殊情况下不会做任何疯狂的事情,因为调用null CWnd *
的“安全”似乎是它存在的全部意义(! )。