In the union U
下面,如果a
or b
是活动成员,是否定义了访问行为c
?
struct A{
int a;
};
struct B{
int a;
double b;
};
union U{
A a;
B b;
int c;
};
In [类.联盟] https://timsong-cpp.github.io/cppwp/n4659/class.union#1,该标准定义了一些规则来使用union
更轻松 (emphasis mine):
[ 注:为了简化联合体的使用,做出了一项特殊保证:如果一个标准布局联合体包含多个标准布局联合体structs共享共同的初始序列,并且如果此标准布局联合类型的对象的非静态数据成员处于活动状态并且是标准布局之一structs,允许检查任何标准布局的公共初始序列struct会员;请参阅[class.mem]。 ——《尾注》
我被这个词挂断了struct这里。标准布局标量是否像int
即使它不是一个结构体也能计数?
My union U
上面确实是一个“标准布局”联合,如下[class] https://timsong-cpp.github.io/cppwp/n4659/class这基本上是说它需要是一个使用union
相反,由于我们只使用标量(标准布局类型),因此它通过了。
-
这些结构显然共享一个共同初始序列 https://timsong-cpp.github.io/cppwp/n4659/class.mem#def:common_initial_sequence由第一个组成int
成员,但尚不清楚基本类型是否可以考虑用于常见的初始序列。
-
[类.联盟] https://timsong-cpp.github.io/cppwp/n4659/class.union#2还说“每个非静态数据成员的分配就好像它是结构体的唯一成员一样。”我认为这提供了它已被定义的证据。
- 最后,标准布局结构不允许在开头有填充([类.mem] https://timsong-cpp.github.io/cppwp/n4659/class#mem-24),并且工会的成员是指针可互换 https://timsong-cpp.github.io/cppwp/n4659/basic.compound#4所以标准告诉我们
int
标准布局结构中的元素和非静态int c
在联盟中保证对齐。
struct A
and struct B
are:
- 包含在标准布局中
union U
,
- 标准布局结构,以及
- 共享一个共同的初始序列。
因此,它们满足“如果标准布局联合包含多个共享公共初始序列的标准布局结构体”这句话中的描述。
The int c
也在联合中的不是这样的结构,也不在这样的结构中。所以这句话并不是告诉你可以写信给c
并检查a.a
or b.a
,也不能写信给a.a
or b.a
并检查c
.
这意味着c
不是您可以检查的常见初始序列的一部分。但它也不会破坏常见的初始序列struct A
and struct B
.
关于文本“每个非静态数据成员的分配就好像它是结构体的唯一成员一样”,该标准在这里的语言有点草率。分配通常是指获取或保留存储,但这种用法似乎是指在给定的存储中布置对象的字节。我在 C++ 标准中没有看到正式的定义(但我没有太努力地寻找),但我确实找到了类似的用途。所以我认为它的意思是每个非-静态数据成员的布局就好像它是唯一的成员一样。
这说明指向这些联合成员中的任何一个的指针与指向任何其他联合成员的指针都指向同一位置。这可能意味着指向一个的指针可以转换为指向另一个的指针。但是,它并不授予您违反严格别名规则的许可。即使x
是一个指向c
and y
是一个指向a
or a.a
,你不能使用*x
访问c
while a
是最后写入的成员或使用*y
while c
是最后写入的成员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)