[英]Can a class with all private members be a POD class?
我之前听说 POD 类型不能有私有数据——但根据 C++0x 草案,我的要求更宽松(强调我的):
对所有非静态数据成员具有相同的访问控制(第 11 条)
这似乎表明私人数据是可以的,只要它都是私人的。 我没有 C++03 的副本来检查...
那么, WindowsApi::Uuid
会是一个 POD 类吗?
namespace WindowsApi
{
class Uuid
{
union
{
::UUID asUuid; //Win32's UUID struct
unsigned __int64 asInt64s[2];
unsigned __int32 asInt32s[4];
};
public:
Uuid() {}
Uuid(::UUID sourceStructure) : asUuid(sourceStructure) {}
operator ::UUID() { return asUuid; }
};
}
我之前听说 POD 类型不能有私有数据
在 C++03 中,POD 类型不能有私有数据(参见 AndreyT 的回答)。
然而 POD 的定义在 C++0x 中已经改变(见9/10
)。
根据n3225
POD 结构是一个既是普通类又是标准布局类的类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。
……POD 类是一个既可以是 POD 结构体也可以是 POD 联合体的类。
这意味着
struct demo
{
private:
int a, b;
};
是 C++0x 中的 POD,因为demo
既简单又标准布局。
标准布局的定义在第9/7
节
标准布局类是这样一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3)和虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第 11 条) ,
- 没有非标准布局的基类,
- 要么在最派生的类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,要么没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类。 11
.
那么,WindowsApi::Uuid 会是一个 POD 类吗?
不! WindowsApi::Uuid
在 C++03 和 C++0x 中都不是 POD。 平凡类是具有平凡默认构造函数(12.1) 且可简单复制的类。 WindowsApi::Uuid
有一个重要的默认构造函数。
那么这个规则在 C++0x 中放松了吗?
是的! (考虑到第 11 条)
C++03 仍然不允许在 POD 类中使用非静态私有或受保护的数据。 该要求在聚集体的定义中指定
聚合是一个数组或类(第 9 条),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第 11 条) ,没有基类(第 10 条),也没有虚函数(10.3) )。
并且 POD 类必须首先是一个聚合。
根据我的 n3225 C++0x 草案, WindowsApi::Uuid
是一个 POD 类。
从第 219 页:POD 结构是一个既是普通类又是标准布局类的类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。
平凡类是具有平凡默认构造函数并且可简单复制的类:
一个普通的可复制类是这样一个类:
标准布局类是这样一个类:
由于WindowsApi
不违反任何这些约束,因此它将是 C++0x 下的有效 POD 类。 正如 AndreyT 所提到的,这是一个比 C++03 更慷慨的措辞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.