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

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实例的指针,至少在某些情况下,这种(丑陋的)代码似乎可以达到预期的目的。它定义得好吗?编译器可以假定访问对象的一个​​成员不会更改其他成员(如果访问的对象本身不包含指向父对象的指针),还是所有子对象都属于某种共享的可变组?

最佳答案

一个可能的问题是offsetof宏的使用,该宏只能与POD类型一起使用。

(维基:)



因此,只要您将struct A定义为符合上述规则,就可以保证它可以正常工作(但确实如前所述,这是不好的做法和难看的代码)。但是,如果不是,则为undefined behaviour

关于c++ - 通过 `this'访问另一个对象的定义性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42611501/

10-14 18:13
查看更多