この質問の反例を考えているうちに、私は思いつきました:
struct A
{
alignas(2) char byte;
};
しかし、それが合法で標準的なレイアウトである場合、これとレイアウト互換struct B
ですか?
struct B
{
char byte;
};
さらに、
struct A
{
alignas(2) char x;
alignas(4) char y;
};
// possible alignment, - is padding
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
// x - - - y - - - x - - - y - - -
struct B
{
char x;
char y;
}; // no padding required
union U
{
A a;
B b;
} u;
と の共通の初期シーケンスはA
ありB
ますか? もしそうなら、それはA::y
&を含みB::y
ますか? つまり、UB を呼び出さずに次のように記述してもよろしいでしょうか?
u.a.y = 42;
std::cout << u.b.y;
(C++1y / "fixed C++11" の回答も歓迎)
配置については [basic.align] を、配置指定子については [dcl.align] を参照してください。
[basic.types]/11 は、基本型について「2 つの型
T1
とT2
が同じ型である場合、T1
とT2
はレイアウト互換型です」と述べています。(根本的な問題はA::byte
、 とB::byte
がレイアウト互換の型を持っているかどうかです)[class.mem]/16 「2 つの標準レイアウト構造体型は、同じ数の非静的データ メンバーを持ち、対応する非静的データ メンバー (宣言順) がレイアウト互換型を持っている場合、レイアウト互換性があります。」
[class.mem]/18 "2 つの標準レイアウト構造体は、対応するメンバーがレイアウト互換の型を持ち、どちらのメンバーもビットフィールドではないか、どちらも 1 つのシーケンスに対して同じ幅のビットフィールドである場合、共通の初期シーケンスを共有します以上の初期メンバー。」
[class.mem]/18 「標準レイアウト共用体に共通の初期シーケンスを共有する 2 つ以上の標準レイアウト構造体が含まれている場合、および標準レイアウト共用体オブジェクトに現在これらの標準レイアウト構造体の 1 つが含まれている場合、それは許可されます。それらの共通の最初の部分を検査します。」
もちろん、言語弁護士レベルでは、別の質問は、共通の初期シーケンスの検査が「許可されている」とはどういう意味かということです。u.b.x
他の段落が上記の未定義の動作(初期化されていないオブジェクトからの読み取り)を行う可能性があると思います。