指向成员函数的指针不是常规指针。 但指向成员函数指针的指针却可以。
struct X {
void func() {}
};
int main() {
auto p1 = &X::func;
auto p2 = &p1;
// reinterpret_cast<int *>(p1); error!
reinterpret_cast<int *>(p2);
}
在上面的代码中,指向成员函数的指针不能直接与
reinterpret_cast
一起使用
但指向成员函数指针的指针却可以。
想知道cppreference或draft在哪里描述了这种情况?
[expr.reinterpret.cast]中的C++标准不允许任何类型的狂野reinterpret_cast,而是允许很长但限制性的情况列表。 对于指向成员的指针,规则是:
“指向 T1 类型 X 成员的指针”类型的纯右值可以显式转换为不同类型的纯右值 如果 T1 和 T2 都是函数类型或都是对象类型,则键入“指向 T2 类型的 Y 成员的指针”。