遇到一个很奇怪的问题,有人知道原因是什么吗?代码在2012下进行测试。
#include <iostream>
struct A {
int a;
};
struct B {
int b;
};
struct C : public A, public B {
int c;
};
int main() {
int C::*p = &C::b;
std::printf("%p\n", &C::b); //00000000
std::printf("%p\n", p); //00000004
return 0;
}发布于 2013-08-29 16:32:54
注意以下可能的意外结果:
printf("typeid(&C::b) = %s\n",typeid(&C::b).name());
printf("typeid(&B::b) = %s\n",typeid(&B::b).name());它在VS2010上产生:
typeid(&C::b) = int B::*
typeid(&B::b) = int B::*这表明& C ::b的结果类型是B类型的成员指针,因为C是从B派生的,所以指针可以自由转换为C类型的成员指针。这解释了所看到的两个值之间的区别。& C ::b是B类型的成员函数指针,int C::*p是C类型的成员函数指针。
int B::*p_b = &B::b;
int C::*p_c = p_b;
printf("p_b = %p\n", p_b);
printf("p_c = %p\n", p_c);发布于 2013-08-29 12:01:54
指向成员的指针不仅仅是普通的C-指针,因此将它们传递给printf实际上是一种未定义的行为,因为printf将相信"%p"和C-将指针传递给void*。
第4.11段列出了指针到标准允许的成员的唯一转换:
B::*T可以转换为D::*T,如果B是D的一个可访问的、非模糊的、非虚拟的基础。指向成员的指针实际上可以有不同的大小,这取决于它们指向的类。
有关MSVC:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/09/70002.aspx中的指针到成员实现的更多信息,请参见此处。
https://stackoverflow.com/questions/18510344
复制相似问题