C++ : ((A*)nullptr)->foo();合法吗?
C++ : ((A*)nullptr)->foo(); is legal?
在深入挖掘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 *
似乎是它存在的全部意义(!)。
相关文章:
- EASTL矢量<向量<int>>连续的
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 反转C++ foo(MyClass &) vs foo(const MyClass &)
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 如何实现这个函数 foo.getSize().x.
- Clearing Class Foo with new(pFoo) Foo()
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 使用 G++ 编译时"Undefined Refrence to Foo"
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- foo(void) vs foo(void *)
- 没有用于调用 foo 的匹配函数
- 两种初始化有什么区别:Foo f();Foo f = Foo()
- 有没有办法删除传递给函数"foo(新对象())"的对象?
- std::size_t 还是 std::vector<Foo>::size_type?
- 引用函数如何"int &foo();"工作?
- 为什么int foo()是右值,而int&foo()在这个例子中是左值?
- <<找不到运算符,尽管定义了 Foo 类型的右操作数,但该运算符仍采用类型为 Foo 的右侧操作数
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么海湾合作委员会抱怨"declaration of 'foo' shadows a previous call [-Werror=shadow]"