之前我听说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; }
};
}
答案 0 :(得分:10)
C ++ 03仍然不允许POD类中的非静态私有或受保护数据。此要求在聚合
的定义中指定聚合是一个数组或类(第9节),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11节),没有基类(第10条),没有虚函数(10.3)。
和POD类必须首先是聚合。
答案 1 :(得分:10)
我之前听说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类吗?
Nopes! WindowsApi::Uuid
既不是C ++ 03中的POD,也不是C ++ 0x中的POD。一个普通的类是一个具有普通默认构造函数(12.1)并且可以轻易复制的类。 WindowsApi::Uuid
有一个非平凡的默认构造函数。
那么这个规则在C ++ 0x中放松了吗?
是的! (考虑第11条)
答案 2 :(得分:-1)
根据我的n3225 C ++ 0x草案,WindowsApi::Uuid
是一个POD类。
从第219页开始: POD结构是一个既简单的类又是标准布局类的类,并且没有非POD结构类型的非静态数据成员,非POD联合(或此类类型的数组)。
一个普通的类是一个具有普通默认构造函数的类,并且可以轻易地复制:
一个简单的可复制类是一个类:
标准布局类是一个类:
由于WindowsApi
没有违反任何这些约束,因此它将是C ++ 0x下的有效POD类。正如AndreyT所提到的,这是比C ++ 03更慷慨的措辞。