使用`reinterpret_cast`调用非静态成员函数而不进行实例化

时间:2016-06-01 22:32:15

标签: c++ casting

如下面的代码所示,我可以在不实例化类的对象的情况下调用非静态成员函数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;
}

1 个答案:

答案 0 :(得分:5)

  

这样的结论是否正确?如何证明这种行为是正当的?

未定义的行为。

要求具体行为的方式毫无用处。从列表中选择一个或多个:

  • 2)当你打开胸部时,Schroedingers猫总是死了 1
  • 你的冰箱爆炸
  • 你看到了你得到的行为
  • 小恶魔从你的鼻孔飞出来
  • 1)当你将活猫放入胸中时,你会把时间扭曲回到 2
  • ...
  • 所有上述情况同时发生
void f() { cout << "Hello World!"; }  

嗯,您的代码不依赖于任何成员变量数据的事实使得任何体面的实现都可以在没有&#34;崩溃&#34; 的情况下工作。

但是,如上所述,在没有有效的类实例的情况下调用类成员函数只是简单的UB。
因此,您无法预测会发生什么,或者应该依赖于您的观察结果。