如下面的代码所示,我可以调用非静态成员函数 A::f
,而无需实例化该类的对象。仅当函数未绑定到任何其他成员时,这才有可能。例如,我不能以类似的方式调用A::g
。
在我看来,如下代码所示的调用A::f
的行为就像调用静态成员函数。这样的结论正确吗?这种行为如何证明是正当的?
#include <iostream>
using namespace std;
struct A {
void f() { cout << "Hello World!"; }
void g() { cout << i; }
int i = 10;
};
int main() {
auto fPtr = reinterpret_cast<void(*)()>(&A::f);
(*fPtr)(); // OK
// auto gPtr = reinterpret_cast<void(*)()>(&A::g);
// (*gPtr)(); // Error!
return 0;
}
这样的结论正确吗?这种行为怎么说得过去?
这是未定义的行为。
询问它应该如何具体表现是没有用的。从列表中选择一个或多个:
void f() { cout << "Hello World!"; }
事实上,您的代码不依赖任何成员变量数据,这使得任何体面的实现都可能在不“崩溃”的情况下工作。
不过,如上所述,调用没有有效类实例的类成员函数只是UB。
因此您无法预测会发生什么,或者应该依赖您的观察。