|
当类或结构不包含某些 C++ 语言功能(例如无法在 C 语言中找到的虚拟函数),并且所有成员都具有相同的访问控制时,该类或结构为标准布局类型。 可以在内存中对其进行复制,并且布局已经过充分定义,可以由 C 程序使用。 标准布局类型可以具有用户定义的特殊成员函数。 此外,标准布局类型还具有以下特征:
没有虚拟函数或虚拟基类
所有非静态数据成员都具有相同的访问控制
类类型的所有非静态成员均为标准布局
所有基类都为标准布局
没有与第一个非静态数据成员类型相同的基类。
满足以下条件之一:
最底层派生类中没有非静态数据成员,并且具有非静态数据成员的基类不超过一个,或者
没有含非静态数据成员的基类
以下代码演示标准布局类型的一个示例:
C++
struct SL
{
// All members have same access:
int i;
int j;
SL(int a, int b) : i(a), j(b) {} // User-defined constructor OK
};
可能使用代码能够更好地说明最后两个要求。 在下一个示例中,即使 Base 是标准布局,Derived 也不是标准布局,因为它(最底层派生类)和 Base 都具有非静态数据成员:
C++
struct Base
{
int i;
int j;
};
// std::is_standard_layout<Derived> == false!
struct Derived : public Base
{
int x;
int y;
};
在此示例中,Derived 是标准布局,因为 Base 没有非静态数据成员:
C++
struct Base
{
void Foo() {}
};
// std::is_standard_layout<Derived> == true
struct Derived : public Base
{
int x;
int y;
};
如果 Base 具有数据成员,并且 Derived 仅具有成员函数,则 Derived 也是标准布局。
|
|