C++ : ((A*)nullptr)->foo();合法吗?

C++ : ((A*)nullptr)->foo(); is legal?

本文关键字:foo gt nullptr C++      更新时间:2023-10-16

在深入挖掘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++?

就语言而言,这是最明显的未定义行为。§9.3.1【class.mfct.non-static】/p2:

如果为对象调用类X的非静态成员函数不是X类型的,或者不是从X派生的类型的,行为未定义。

据推测,编写该函数的人都知道,在这种特殊情况下,微软的编译器不会做任何疯狂的事情,因为"安全"地调用空CWnd *似乎是它存在的全部意义(!)。