假设我们有一个像这样的对象:
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实例的指针,至少在某些情况下,这种(丑陋的)代码似乎做了预期的事情。它虽然定义得很好吗?编译器是否可以假设访问对象的一个成员不会改变其他成员(如果被访问对象本身不包含指向父对象的指针),或者所有子对象是否属于某种共享可变组?
答案 0 :(得分:0)
一个可能的问题在于offsetof
宏的使用,它只能与POD类型一起使用。
(维基:)
C ++中的普通旧数据结构是一个聚合类,它只包含PODS作为成员,没有用户定义的析构函数,没有用户定义的复制赋值运算符,也没有指向成员类型的非静态成员。
因此,只要您的struct A
被定义为符合上述规则,就可以保证其正常工作(但事实证明这是不好的做法和丑陋的代码)。但如果不是,你有undefined behaviour。