说我们有一个像这样的对象:
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/