在不相关的全等课程之间进行投射

Jan*_*ann 6 c++ casting

假设我有两个来自两个不同库的相同成员的类:

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.

Ark*_*nez 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