如下面的代码所示,我可以在不实例化类的对象的情况下调用非静态成员函数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;
}
答案 0 :(得分:5)
这样的结论是否正确?如何证明这种行为是正当的?
未定义的行为。
要求具体行为的方式毫无用处。从列表中选择一个或多个:
void f() { cout << "Hello World!"; }
嗯,您的代码不依赖于任何成员变量数据的事实使得任何体面的实现都可以在没有&#34;崩溃&#34; 的情况下工作。
但是,如上所述,在没有有效的类实例的情况下调用类成员函数只是简单的UB。
因此,您无法预测会发生什么,或者应该依赖于您的观察结果。