我以前听说过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; }
};
}发布于 2011-01-21 19:13:28
C++03仍然不允许POD类中的非静态私有数据或受保护的数据。此要求在聚合的定义中指定。
聚合是一个数组或一个类(第9条),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),也没有虚拟函数(10.3)。
POD类必须首先是一个聚合类。
发布于 2011-01-21 19:27:47
我以前听说过POD类型不能有私有数据
在C++03中,POD类型不能有私有数据(请参阅AndreyT的答案)。
然而,在C++0x中,过氧化物酶的定义发生了变化(见9/10)。
根据n3225
POD结构是一个平凡类和一个标准布局类的类,它没有非POD结构、非POD联合(或此类类型数组)类型的非静态数据成员。 ... POD类是一个POD结构或POD结合的类。
这意味着
struct demo
{
private:
int a, b;
};在C++0x中是POD,因为demo既是普通的,又是的标准布局。
标准布局的定义在9/7节中
标准布局类是这样一个类:
。
那么,WindowsApi::Uuid会是POD类吗?
不!WindowsApi::Uuid在C++03和C++0x中既不是POD。平凡类是一个具有普通默认构造函数 (12.1)的类,并且是微不足道的可复制类。WindowsApi::Uuid有一个非平凡的默认构造函数。
那么这个规则在C++0x中被放松了吗?
是!(考虑到第11条)
还可以查看关于集合和吊舱的常见问题条目
发布于 2011-01-21 19:29:52
根据我的n3225 C++0x草案,WindowsApi::Uuid是一个POD类。
从第219页: POD结构是一个类,它既是一个平凡的类,也是一个标准布局类,并且没有非POD结构、非POD联合(或此类类型的数组)类型的非静态数据成员。
一个平凡的类是一个类,它有一个简单的默认构造函数,并且几乎是可以复制的:
一个微不足道的可复制类是这样一个类:
标准布局类是这样一个类:
因为WindowsApi没有违反任何这些约束,所以它将是C++0x下的一个有效的POD类。正如AndreyT所提到的,这是一个比C++03更慷慨的措辞。
https://stackoverflow.com/questions/4762788
复制相似问题