提问者:小点点

使用“reinterpret_cast”在没有实例化的情况下调用非静态成员函数


如下面的代码所示,我可以调用非静态成员函数 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个答案

匿名用户

这样的结论正确吗?这种行为怎么说得过去?

这是未定义的行为。

询问它应该如何具体表现是没有用的。从列表中选择一个或多个:

    < li>2)打开箱子时,总是会发现薛定谔的猫已经死了 < li >你的冰箱爆炸了 < li >您看到您得到的行为 <李>小恶魔从你的鼻孔里飞出来了 < li>1)当你把活猫放进箱子< sup>2时,你就把时间扭曲回了那个点 <李>... < li >上述所有情况同时发生
void f() { cout << "Hello World!"; }  

事实上,您的代码不依赖任何成员变量数据,这使得任何体面的实现都可能在不“崩溃”的情况下工作。

不过,如上所述,调用没有有效类实例的类成员函数只是UB。
因此您无法预测会发生什么,或者应该依赖您的观察。