假设我有两个来自两个不同库的相同成员的类:
namespace A {
struct Point3D {
float x,y,z;
};
}
namespace B {
struct Point3D {
float x,y,z;
};
}
Run Code Online (Sandbox Code Playgroud)
当我尝试交叉投射时,它有效:
A::Point3D pa = {3,4,5};
B::Point3D* pb = (B::Point3D*)&pa;
cout << pb->x << " " << pb->y << " " << pb->z << endl;
Run Code Online (Sandbox Code Playgroud)
在哪种情况下这保证有效?总是?请注意,编辑外部库以添加对齐编译指示或类似的东西是非常不受欢迎的.我在Ubuntu 8.10上使用g ++ 4.3.2.
如果您使用的结构只是数据并且没有使用继承,我认为它应该始终有效。
\n\n只要它们是 POD 就应该没问题。\n http://en.wikipedia.org/wiki/Plain_old_data_structs
\n\n依据标准(1.8.5)
\n\n“除非它是位\xef\xac\x81字段(9.6),否则大多数派生对象应具有非零大小,并应占用\n存储的一个或多个字节。基类子对象的大小可能为零。 POD5)\n类型 (3.9) 应占用\n存储的连续字节。”
\n\n如果它们占用连续的存储字节并且它们是具有不同名称的相同结构,则强制转换应该成功
\n