gez*_*eza 17 c++ language-lawyer
这两个结构是否布局兼容?
struct One {
float x, y, z;
};
struct Two {
float c[3];
};
Run Code Online (Sandbox Code Playgroud)
两者都包含3个浮点数,所以在某种程度上,这种描述可以认为是真的(来自N3797):
16如果两个标准布局结构(第9节)类型具有相同数量的非静态数据成员且相应的非静态数据成员(按声明顺序)具有布局兼容类型(3.9),则它们是布局兼容的.
N4659有不同的文字:
两个标准布局结构(第12节)类型的公共初始序列是声明顺序中最长的非静态数据成员和位字段序列,从每个结构中的第一个这样的实体开始,使得相应的实体具有布局兼容类型,要么实体都不是位字段,要么两者都是具有相同宽度的位字段.
如果两个标准布局结构(第12章)类型的公共初始序列包含两个类的所有成员和位字段(6.9),则它们是布局兼容类.
如果答案是否定的,那么它们与布局不兼容,那么:这是委员会的意图吗?也许他们确实想要One和Two布局兼容(也许委员会成员会读到这个,并且可以澄清).
奖金问题:有保证sizeof(One)==sizeof(Two)吗?
Bar*_*rry 10
好吧,不,
[...]如果他们拥有相同数量的非静态数据成员[...]
One有三个成员:x,y,和z.Two有一个成员:c.它们没有相同数量的非静态数据成员,因此它们不是布局兼容的.
新的措辞是不同的,但你最终在同一个地方.[basic.types]将布局兼容定义为:
如果T1和T2是相同类型,布局兼容的枚举或布局兼容的标准布局类类型,则两种类型cv1 T1和cv2 T2是布局兼容类型.
[class.mem] 定义与布局兼容的类是:
如果两个标准布局结构类型的公共初始序列包含两个类的所有成员和位字段([basic.types]),则它们是布局兼容类.
共同的初始序列是:
两个标准布局结构类型的公共初始序列是声明顺序中最长的非静态数据成员序列和位字段,从每个结构中的第一个这样的实体开始,使得对应的实体具有布局兼容类型并且要么实体都不是位域,要么两者都是具有相同宽度的位域.
在此,所述第一构件One(float x)不是布局兼容的第一部件Two(float c[3]),所以公共初始序列是空的.