通过“this”访问另一个对象的定义?

时间:2017-03-05 17:20:53

标签: c++ struct

假设我们有一个像这样的对象:

struct B {
  void access_a() {
    A* a = reinterpret_cast<A*>(reinterpret_cast<char*>(this)
                                - offsetof(A, b));
    // is accessing a here well defined, assuming this object
    // is one that is inside struct A?
  }
};
struct A {
  /* one or more standard layout types before b */
  B b;
} a;

a.b.access_a();

理论上我们确实有一个指向A实例的指针,至少在某些情况下,这种(丑陋的)代码似乎做了预期的事情。它虽然定义得很好吗?编译器是否可以假设访问对象的一个​​成员不会改变其他成员(如果被访问对象本身不包含指向父对象的指针),或者所有子对象是否属于某种共享可变组?

1 个答案:

答案 0 :(得分:0)

一个可能的问题在于offsetof宏的使用,它只能与POD类型一起使用。

(维基:)

  

C ++中的普通旧数据结构是一个聚合类,它只包含PODS作为成员,没有用户定义的析构函数,没有用户定义的复制赋值运算符,也没有指向成员类型的非静态成员。

因此,只要您的struct A被定义为符合上述规则,就可以保证其正常工作(但事实证明这是不好的做法和丑陋的代码)。但如果不是,你有undefined behaviour