C++ 什么';s结构';什么是初始序列?
我遇到了最初的序列概念。通过标准的C++ 什么';s结构';什么是初始序列?,c++,struct,language-lawyer,unions,C++,Struct,Language Lawyer,Unions,我遇到了最初的序列概念。通过标准的初始序列短语只给出3个结果,它们没有给出定义 第N3797::9.5/1节[class.union]: 如果标准布局联合包含多个标准布局结构 共享一个共同的初始序列(9.2),如果 标准布局联合类型包含一个标准布局 结构,允许检查任何 标准布局结构成员的定义 我想看一个例子来说明这句话。我相信它是在谈论这类事情: union U { struct S { int a; int b; int c; }
初始序列短语只给出3个结果,它们没有给出定义
第N3797::9.5/1节[class.union]
:
如果标准布局联合包含多个标准布局结构
共享一个共同的初始序列(9.2),如果
标准布局联合类型包含一个标准布局
结构,允许检查任何
标准布局结构成员的定义
我想看一个例子来说明这句话。我相信它是在谈论这类事情:
union U {
struct S {
int a;
int b;
int c;
}
struct T {
int x;
int y;
float f;
}
};
这意味着可以访问U.s.a
或U.T.x
,并且它们将是等效的。当然,U.S.b
和U.T.y
也一样。但是在设置U.S.c
之后访问U.T.f
将是未定义的行为。是什么阻止您只写一个示例?关键词“standard layout union type包含一个标准布局结构”@Cheersandhth.-Alf初始Sequence是什么?我认为这是说,只要数据成员是相同类型的,它们之间的填充将是相同的,并且成员将正确地彼此别名。这意味着使用一个结构的标识符输入一个数字可以使用不同的结构的标识符(从同一位置)准确地获取,直到其中一个结构包含与另一个不同的类型(按声明顺序)。(这个解释比文件要简单吗?)!这里的关键短语是公共初始序列
,如果所有结构都以int-kind开头,那么公共部分很重要代码>那么这就是常见的初始序列。@DmitryFucintv根据我的理解,您的示例不会导致UB。但是,一旦类型的声明顺序不同,这种保证就结束了。S.a,S.b
是否需要与T.a,T.b
具有相同的名称?如果设置了S.c,则访问T.f是UB。但a&b是“共同初始序列”的一部分,可以access@PaulR:名称不会影响内存布局。也就是说,名字不重要。@sp2danny:不重要。c++11 9.2/19“如果对应的成员具有与布局兼容的类型,并且两个标准布局结构都不是位字段,或者对于一个或多个初始成员的序列,两个标准布局结构共享一个共同的初始序列”。@DmitryFucintv:是的,数据成员,因为我们讨论的是内存布局。类型可以在本地定义,也可以不定义,这无关紧要。