为什么指向非常量成员函数的指针不能指向常量成员函数和相反的函数?
Why pointer to non-const member function can't point const member function and opposite?
指向
成员函数的指针不能指向常量成员函数的原因是什么?
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
修饰符是函数签名的一部分。声明函数指针后,该函数指针只能用于将指针分配给具有相同函数签名的函数。
非静态成员函数有一个额外的隐藏this
参数。鉴于存在该额外隐藏参数,非静态void A::f() const;
的行为与void A__f(const A *__this)
非常相似,并且您看到的成员函数的行为模拟了非成员函数的行为。
void f(void *);
void (*pf)(const void *) = f; // also an error
至于它是否可以在任何实现上中断,我想理论上,允许实现从与const void *
参数不同的寄存器中读取void *
参数,如果是这样,转换的结果(如果有效)不能用于正确调用f
。我不知道为什么任何实现者都会做出这样的决定,我也不知道有任何真正的实现会这样做,但这是标准允许的。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针