共通の接頭辞で、標準レイアウト型へのポインタをキャストするのは、私は次のタイプがあるとしましょう:再解釈が
struct Common { int a, b, c; };
struct Full { int a, b, c; uint64_t x, y, z; };
Common
とFull
はCommon
がFull
の接頭辞である標準レイアウトタイプ、です。私は労働組合の両方を置くのであれば:
union U {
Common c;
Full f;
};
私はf
が [class.mem]/23あたりのアクティブメンバーであった場合でも、c
を通読して許可されます。
質問があります - 私には、Full const*
と与えられた方法は、UB以外の方法でCommon const*
を得ることですか?
void foo(Full const* f) {
Common c1;
memcpy(&c1, f, sizeof(c1)); // this obviously works, but I don't want
// to be copying all this stuff
auto c2 = reinterpret_cast<Common const*>(f); // is this ok?
// c2 and f are pointer-interconvertible iff f comes from a U
// but why does that U actually need to exist?
auto u = reinterpret_cast<U const*>(f); // ok per basic.lval/8.6??
auto c3 = &u->c; // ok per class.mem/23??
}
"pointer-interconvertible"はオブジェクトのプロパティであり、型ではありません。共用体がない場合、 'reinterpret_cast'の結果は依然として' * f'を指しています。 –
@ T.C。ええ、無関係なタイプの無関係なオブジェクトを要求するのはちょっと奇妙ではありませんか? – Barry
これはC互換性のためだけに存在する型システムの例外です。 P0137R0がすべてを完全に禁止したことを思い出してください。 –