为什么指向非const成员函数的指针不能指向const成员函数而相反?

时间:2014-01-19 20:31:15

标签: c++ pointers const function-pointers

指向成员函数的指针是什么原因,不能指向const成员函数?

struct A {
    void g() {};
    void f() const {}
};

稍后在代码中:

void (A::* fun)() = &A::f;

此代码生成:

error: cannot convert ‘void (A::*)()const’ to ‘void (A::*)()’ in initialization

当然,它会使用&A::g而不是&A::f进行编译。

相反的情况:

void (A::* fun)() const = &A::g;

错误是:

error: cannot convert ‘void (A::*)()’ to ‘void (A::*)()const’ in initialization

第二种情况相当清楚。预期const指针不会修改对象,因此它无法保存执行该操作的函数。但是,为什么不能像第一种情况那样将const成员函数分配给non-const成员函数?

看起来像普通指针的规则,其中constnon-const允许修改值,但我没有看到这里的重点,其中在函数定义中检查了const-correctness ,在这样的任命之前。

2 个答案:

答案 0 :(得分:4)

  

指向成员函数的指针是什么原因,不能指向const成员函数?

因为const修饰符是函数签名的一部分。声明函数指针后,该函数指针只能用于指定具有相同函数签名的函数的指针。

答案 1 :(得分:3)

非静态成员函数具有额外的隐藏this参数。鉴于存在额外的隐藏参数,非静态void A::f() const;的行为与void A__f(const A *__this)非常相似,您在成员函数中看到的行为会模拟非成员函数的行为。

void f(void *);
void (*pf)(const void *) = f; // also an error

至于它是否可以在任何实现上中断,我认为理论上允许实现从不同于void *参数的寄存器中读取const void *参数,如果是,则结果转换(有效)无法用于正确调用f。我不知道为什么任何实现者会做出这样的决定,我不知道有任何实际的实现,但这是标准所允许的。