这两个结构是否布局兼容?
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)吗?
我可以把T和一个包裹T在union并检查他们,因为我喜欢?
union Example {
T value;
struct Wrapped {
T wrapped;
} wrapper;
};
Run Code Online (Sandbox Code Playgroud)
// for simplicity T = int
Example ex;
ex.value = 12;
cout << ex.wrapper.wrapped; // ?
Run Code Online (Sandbox Code Playgroud)
C++ 11标准只保证保存对常见初始序列的检查,但value不是struct.我猜答案是否定的,因为包装类型甚至不能保证与其解包对应的内存兼容,并且访问非活动成员只能在常见的初始序列上明确定义.