两个相同类别的指针之间的铸造安全性?

Ann*_*inn 9 c++ pointers casting

假设我有两个不同的类,它们以相同的内部方式表示2D坐标数据,如下所示:

class LibA_Vertex{
    public:
    // ... constructors and various methods, operator overloads
    float x, y
};

class LibB_Vertex{
    public:
    // ... same usage and internal data as LibA, but with different methods
    float x, y
};


void foobar(){
    LibA_Vertex * verticesA = new LibA_Vertex[1000];
    verticesA[50].y = 9;
    LibB_Vertex * verticesB = reinterpret_cast<LibB_Vertex*>( vertexA );
    print(verticesB[50].y); // should output a "9"
};
Run Code Online (Sandbox Code Playgroud)

鉴于两个类是相同的并且上面的函数,我可以可靠地指望这个指针转换在每种情况下按预期工作吗?

(背景是,我需要一种简单的方法来交换具有相同Vertex类的两个独立库之间的顶点数组,我想避免不必要地复制数组).

Ben*_*igt 13

C++ 11增加了一个名为layout-compatible的概念,适用于此处.

两个标准布局结构(第9)的类型是布局兼容如果它们具有相同数量的非静态数据成员和相应的非静态数据成员(在声明顺序)的具有布局兼容的类型(3.9).

哪里

标准布局类是一个类:

  • 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
  • 没有虚函数(10.3),也没有虚基类(10.1),
  • 对所有非静态数据成员具有相同的访问控制(第11条),
  • 没有非标准布局基类,
  • 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
  • 没有与第一个非静态数据成员相同类型的基类.

标准布局结构是一个标准布局类与所定义的类键 struct类键 class.

标准布局联盟是一个标准布局类与所定义的类键 union.

最后

符合cv资格和cv不合格版本(3.9.3)的布局兼容类型的指针应具有相同的值表示和对齐要求(3.11).

哪种保证reinterpret_cast可以将指向一种类型的指针转​​换为指向任何布局兼容类型的指针.

  • 另一种明确定义的方法是使用具有公共初始序列的并集(如§9.2/ 19`所允许的). (3认同)
  • @Clairvoire:这是在实践中始终有效的事情之一,尽管被正式禁止。我不希望任何编译器编写者必须“添加”支持。 (2认同)
  • 它从未被"禁止",它只是"未定义的行为".只是我所知道的每个编译器中的实际行为都是按照您的预期工作.C++ 11只是基本上定义了每个编译器正在使用的行为. (2认同)