指向成员函数的指针是什么原因,不能指向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
成员函数?
看起来像普通指针的规则,其中const
到non-const
允许修改值,但我没有看到这里的重点,其中在函数定义中检查了const-correctness ,在这样的任命之前。
答案 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
。我不知道为什么任何实现者会做出这样的决定,我不知道有任何实际的实现,但这是标准所允许的。