根据C++11 9.1/7 (draft n3376),标准布局类是这样的类:
没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
没有虚函数 (10.3) 和虚基类 (10.1),
对所有非静态数据成员具有相同的访问控制(Clause11),
没有非标准布局的基类,
要么在派生最多的类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,要么没有具有非静态数据成员的基类,并且
没有与第一个非静态数据成员相同类型的基类。
因此空类是标准布局类;并且另一个以空类为基类的类也是标准布局类,前提是此类的第一个非静态数据成员与基类的类型不同。
此外,9.2/19指出:
指向标准布局结构对象的指针,使用 a 进行适当转换
reinterpret_cast
,指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。[注意:因此,标准布局结构对象中可能存在未命名的填充,但不是在其开头,这是实现适当对齐所必需的。——尾注]
这似乎意味着空基类优化现在是一种强制优化,至少对于标准布局类是这样。我的观点是,如果不强制要求空基优化,那么标准布局类的布局将不是标准的,而是取决于实现是否实现了所述优化。我的推理是正确的,还是我错过了什么?