假设我有两个类,它们具有来自两个不同库的相同成员:
namespace A {
struct Point3D {
float x,y,z;
};
}
namespace B {
struct Point3D {
float x,y,z;
};
}
当我尝试交叉转换时,它成功了:
A::Point3D pa = {3,4,5};
B::Point3D* pb = (B::Point3D*)&pa;
cout << pb->x << " " << pb->y << " " << pb->z << endl;
这在什么情况下保证有效?总是?请注意,编辑外部库以添加对齐编译指示或类似内容是非常不可取的。我在 Ubuntu 8.10 上使用 g++ 4.3.2。
最佳答案
如果您使用的结构只是数据并且没有使用继承,我认为它应该始终有效。
只要是 POD 就应该没问题。 http://en.wikipedia.org/wiki/Plain_old_data_structures
按照标准(1.8.5)
“除非它是一个位域(9.6),一个最派生的对象应该有一个非零的大小并且应该占据一个或多个字节 贮存。基类子对象的大小可能为零。 POD5的一个对象) 类型 (3.9) 应占用的连续字节 存储。”
如果它们占用连续的存储字节并且它们是具有不同名称的相同结构,则转换应该成功
关于c++ - 在不相关的全等类之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1260040/