将[[no_unique_address]]与空基类继承结合时获得意外结果
考虑以下:
struct Base {};
struct Empty {};
struct X : Base {
int i;
[[no_unique_address]] Empty e;
};
static_assert(sizeof(X) == 4);
在X继承了空Base和收益EBO,由于其成员e也使用[[no_unique_address]]属性,这使得大小X只的规模int。
但是当我X用作另一个Y继承空的结构的成员变量时Base,的大小Y突然变为8:
struct Y : Base {
X x;
[[no_unique_address]] Empty e;
};
static_assert(sizeof(Y) == 8);
是否Y违反标准并禁止 EBO?或者这仅取决于编译器供应商的实现?
回答
直接引用自cppreference:
如果空基类之一也是第一个非静态数据成员的类型或类型的基类,则禁止空基类优化,因为相同类型的两个基子对象在对象表示中需要具有不同的地址派生最多的类型。
THE END
二维码