【问题标题】:What's the struct's initial sequence?结构的初始序列是什么?
【发布时间】:2014-10-25 07:41:59
【问题描述】:

我遇到了最初的序列概念。对initial sequence 短语的标准进行搜索仅给出 3 个结果,并且它们没有给出定义。

部分N3797::9.5/1 [class.union]

如果标准布局联合包含多个标准布局结构 共享一个共同的初始序列(9.2),如果这个对象 标准布局联合类型包含标准布局之一 结构,允许检查任何的公共初始序列 标准布局结构成员;

我想看一个例子来证明那句话。

【问题讨论】:

  • 是什么阻止你写一个例子?关键词“标准布局联合类型包含标准布局结构之一”
  • @Cheersandhth.-Alf 最初的顺序是什么?
  • 我认为这是说只要数据成员属于同一类型,它们之间的填充将相同,并且成员将正确地相互别名。这意味着使用一个结构的标识符输入一个数字可以使用不同的结构标识符准确地取出(从同一位置)直到其中一个结构包含与另一个不同的类型(按声明顺序) . (这个解释比文档简单吗?)!
  • 这里的关键短语是common initial sequence,公共部分很重要,如果所有结构都以int kind;开头,那么这就是公共的初始序列。
  • @DmitryFucintv 根据我的理解,您的示例导致 no UB。但只要声明顺序的类型不同,这种保证就会终止。

标签: c++ struct language-lawyer unions


【解决方案1】:

我相信它在谈论这种事情:

union U {
    struct S {
        int a;
        int b;
        int c;
    }
    struct T {
        int x;
        int y;
        float f;
    }
};

意思是访问U.S.aU.T.x 都可以,并且它们是等效的。当然U.S.bU.T.y 也一样。但是在设置U.S.c 之后访问U.T.f 将是未定义的行为。

【讨论】:

  • S.a, S.b 是否必须与T.a, T.b 同名?
  • 访问 T.f 是 UB,如果设置了 S.c。但 a & b 是“通用初始序列”的一部分,可以访问
  • @PaulR:名称不会影响内存布局。 IE。名字无关紧要。
  • @sp2danny:不。 c++11 9.2/19“如果对应的成员具有布局兼容的类型,并且两个成员都不是位域或两者都是具有相同宽度的位域,则两个标准布局结构共享一个共同的初始序列或更多初始成员”。
  • @DmitryFucintv:是的,数据成员,因为我们正在讨论内存布局。类型可以本地定义,也可以不定义,没关系。
猜你喜欢
  • 2016-02-22
  • 2011-12-24
  • 2011-03-02
  • 2020-12-04
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多