聚合类型是否意味着它也是标准布局?
Does an aggregate type imply that it is also standard layout?
聚合类型 (std::is_aggregate_v<T> == true
) 是否暗示该类型也是标准布局 (std::is_standard_layout_v<T> == true
)?我的直觉是答案是肯定的,但我并不完全相信。
没有。想象一下你有一个像
这样的设置
struct A
{
int a;
};
struct B : A
{
};
struct C : B
{
int c;
};
这里A
、B
、C
都是聚合,只有A
、B
是标准布局。
不,不是。对于要成为标准布局的 class 类型,其所有非静态成员本身必须是标准布局。但相同的递归要求并未强加于聚合。所以一个简单的反例
struct bar {
virtual ~bar() {}
};
struct foo {
bar b;
};
foo
是聚合,但不是标准布局
聚合类型 (std::is_aggregate_v<T> == true
) 是否暗示该类型也是标准布局 (std::is_standard_layout_v<T> == true
)?我的直觉是答案是肯定的,但我并不完全相信。
没有。想象一下你有一个像
这样的设置struct A
{
int a;
};
struct B : A
{
};
struct C : B
{
int c;
};
这里A
、B
、C
都是聚合,只有A
、B
是标准布局。
不,不是。对于要成为标准布局的 class 类型,其所有非静态成员本身必须是标准布局。但相同的递归要求并未强加于聚合。所以一个简单的反例
struct bar {
virtual ~bar() {}
};
struct foo {
bar b;
};
foo
是聚合,但不是标准布局