我知道这是一种可怕的做法,但仍然在疑惑。 当我将派生类的指针成员转换为基类的指向成员时,如下所示:
struct A
{
void foo(){};
};
struct B: A
{
void bar(){}
};
int main()
{
void (A::*p)() = (void (A::*)())(&B::bar); // shit
return 0;
}
编译器(clang,gcc)给了我错误,这是正确的! 但是,如果我声明typedef是这样的:
struct A
{
typedef void (A::*handler)();
void foo(){};
};
struct B: A
{
void bar(){}
};
int main()
{
void (A::*p)() = (A::handler)(&B::bar);
return 0;
}
没关系并且编译。为什么这个typedef会影响编译?我怀疑这应该导致UB。它是否使程序结构良好?