联合中的标量成员是否计入共同的初始序列?

时间:2018-01-11 14:18:20

标签: c++ language-lawyer c++17 unions

在下面的; extension_dir = "ext" ;extension=php_mbstring.so ;extension=php_exif.so 中,如果union Ua是活动成员,是否定义了访问b的行为?

c

[class.union]中,标准定义了一些使struct A{ int a; }; struct B{ int a; double b; }; union U{ A a; B b; int c; }; 更容易使用的规则(强调我的):

  

[注意:为了简化联合的使用,我们做了一个特别的保证:如果标准布局联合包含多个标准布局结构,它们共享一个共同的初始序列,如果是非此标准布局联合类型的对象的静态数据成员是活动的并且是标准布局结构之一,允许检查任何标准布局的公共初始序列< strong> struct 成员;见[class.mem]。 - 结束说明]

我在这里挂了 struct 这个词。像union那样的标准布局标量是否算在内,即使它不是结构?

  • 我上面的int确实是一个&#34;标准布局&#34;在[class]之后的联合基本上说它需要是一个使用union U关键字的标准布局类,而且因为我们只使用标量(标准布局类型),所以它会通过。

  • 结构显然共享一个由union成员组成的common initial sequence,但不清楚基本类型是否可以考虑用于常见的初始序列。

    • [class.union]也说&#34;每个非静态数据成员都被分配,好像它是结构的唯一成员一样。&#34;我认为这证明它已被定义。
  • 最后,标准布局结构不允许在开头([class.mem])填充,并且联合的成员是pointer interconvertible所以标准告诉我们int标准布局结构中的元素,并且联合中的非静态int保证对齐。

1 个答案:

答案 0 :(得分:6)

struct Astruct B是:

  • 包含在标准布局union U
  • 标准布局结构和
  • 分享一个共同的初始序列。

因此,它们满足句子中的描述“如果标准布局联合包含几个共享一个共同初始序列的标准布局结构......”。

联合中的int c也不是这样的结构,也不是这样的结构。所以这句话并没有告诉你,你可以写信c并检查a.ab.a,也不能写信给a.ab.a并检查c

这意味着c不是您可以检查的常见初始序列的一部分。但它也不会破坏struct Astruct B的共同初始序列。

关于文本“每个非静态数据成员被分配就好像它是结构的唯一成员”,标准在这里使用语言有点草率。分配通常是指获取或保留存储,但这个用途似乎是指在给定的存储空间中布置对象的字节。我没有在C ++标准中看到正式的定义(但我看起来并不太难),但我确实找到了类似的用法。所以我认为它意味着每个非静态数据成员的布局就好像它是唯一的成员一样。

这说明指向这些联盟成员中的任何一个的指针指向与指向任何其他联盟成员的指针相同的位置。这可能意味着指向一个的指针可以转换为指向另一个的指针。但是,它不会授予您违反严格别名规则的许可。即使x是指向c的指针而y是指向aa.a的指针,也不能使用*x来访问c 1}} a是最后写的成员或使用*yc是最后写的成员。