当前位置: 首页 > 知识库问答 >
问题:

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

牧宁
2023-03-14

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

葛越
2023-03-14

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

这是未定义的行为。

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

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

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

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

 类似资料:
  • 这个问题相当复杂,我不知道以前是否有人问过,因为我不知道如何在搜索框中表达这个问题。 下面是代码: 静态成员将在更多静态方法中再次使用,但我需要首先将其时区设置为“UTC”。有没有方法调用<code>。setTimeZone(“UTC”)一劳永逸?或者我必须调用<code>。setTimeZone(“UTC”)在每个静态方法中?

  • 在过去的一周左右,我一直在绞尽脑汁,真的需要一些帮助。我的apk构建得很好,在linux上运行main.py工作得很好,然而,当在我的galaxy s6上运行apk时,它在打开后不久就崩溃了。我尝试更新buildozer,kivy,确保所有的依赖关系都得到满足,并包含在规范文件中(如下)。以及尝试无数其他解决方案,如更改api、更新所有构建工具等。 有人有什么想法吗?这里有一个到logcat的链接

  • 我看到的所有解决方案都需要使用。但是,我想在Eclipse之外的单个文件上使用CDT解析器。那有什么办法吗?

  • 我有一门课: 问题是,只有我实例化了那个类,它才会运行。 不管怎样,我怎么能强迫它运行呢?

  • 这个问题是关于实施d::add问题的后续_pointer 在std::add\u指针下 有以下参考: 否则(如果T是cv或ref限定函数类型),则提供成员类型DEF type,即类型T。 基于阅读非静态成员函数:const-、vole-和ref限定的成员函数,我的理解是a对于具有给定和/或限定的非静态成员函数, a)函数的限定也适用于指针,在函数的范围内 b) 函数的限定不适用于函数范围内的指针

  • 我想知道为什么C中的函数重载解析在调用静态方法时会考虑非静态成员函数。 我已经阅读了这里的文档,其中指出 如果任何候选函数是成员函数(静态或非静态),但不是构造函数,则将其视为具有额外参数(隐式对象参数),该参数表示调用它们的对象并出现在第一个之前实际参数。 因此,请考虑以下代码。 那么调用A::foo(1.f,1.f)是不明确的。 静态成员函数用于非静态函数调用的重载解析,这很有意义。 但是为什