は、私たちがこのようなオブジェクトaを持っていると言う:`this 'を通して他のオブジェクトにアクセスする定義?
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つのメンバーへのアクセスが他のオブジェクトを変更しないと仮定できますか(アクセスされたオブジェクト自体に親へのポインタが含まれていない場合)、またはすべての子オブジェクトは何らかの共有可変グループに属していますか?
*オブジェクトの1つのメンバーにアクセスすることによって、他のメンバーを変更しないとはどういう意味ですか?メンバーアドレスを変更することを意味しますか?または、コンパイラが他のメンバーに含まれる値が変更されないと想定するかどうかを知りたいですか?それは最初の質問にどのように関連していますか?私は潜在的な*変更可能なグループに関する質問を理解しようとしています*。 – wally
可能な複製:http://stackoverflow.com/questions/1453393/legit-uses-of-the-offsetof-macro-in-cc –
有効な質問ですが、実際のコードでこれを使用したい場合に備えて:This *強く*壊れたクラスデザインのようなにおいがします。 –