【问题标题】:Pointers to members representations指向成员表示的指针
【发布时间】:2012-12-02 06:48:36
【问题描述】:

我正在尝试从成员函数中进行一些回调并且一切正常,直到我尝试使用从 2 个类派生的模板类作为回调对象时出现以下错误:

error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them

这件事告诉我成员函数指针有不同的表示(doh!)

这些表示是什么?它们有什么区别?

【问题讨论】:

  • 你可能想看看std::bind,它可以绑定一个成员函数和一个对象,以及std::function,它可以存储结果回调。
  • @MSalters 我只是在做一些测试来提升一些东西(不安全,我知道 - 但它们是测试)。
  • std::function 是要走的路。

标签: c++ function-pointers member-function-pointers


【解决方案1】:

Danny Kalev explains this quite nicely:

指向成员的指针的基本表示

尽管指向成员的指针表现得像普通指针,但在幕后它们的表示是完全不同的。实际上,在某些情况下,指向成员的指针通常由一个最多包含四个字段的结构组成。这是因为指向成员的指针不仅要支持普通的成员函数,还要支持虚成员函数、具有多个基类的对象的成员函数以及虚基类的成员函数。因此,最简单的成员函数可以表示为一组两个指针:一个保存成员函数的物理内存地址,另一个保存this 指针。但是,在虚拟成员函数、多重继承和虚拟继承等情况下,指向成员的指针必须存储附加信息。因此,您不能将指向成员的指针转换为普通指针,也不能在指向不同类型成员的指针之间安全地进行转换。

要了解编译器如何表示指向成员的指针,请使用sizeof 运算符。在以下示例中,采用指向数据成员的指针和指向成员函数的指针的大小。如您所见,它们具有不同的大小,因此具有不同的表示:

struct A
{
 int x;
 void f();
};
int A::*pmi = &A::x;
void (A::*pmf)() = &A::f;
int n = sizeof (pmi); // 8 byte with my compiler
int m = sizeof (pmf); // 12 bytes with my compiler

请注意,这些指针中的每一个都可能具有不同的表示形式,具体取决于所讨论的类以及成员函数是否为虚拟。

【讨论】:

    【解决方案2】:

    这是微软的事情:在某些情况下,它们使指向成员函数的指针更小,代价是生成指向具有不同表示形式的成员函数的指针,正如您刚刚看到的那样。有一个开关可以关闭此功能 (/vmg),以便所有指向成员的指针都具有相同的表示形式。

    【讨论】:

    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 2013-05-02
    • 2012-08-20
    • 2023-03-12
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多