我之前听说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; }
};
}
Run Code Online (Sandbox Code Playgroud)
Pra*_*rav 12
我之前听说POD类型不能拥有私有数据
在C++ 03中,POD类型不能拥有私有数据(参见AndreyT的回答).
但是,POD的定义在C++ 0x中已经改变(参见参考资料9/10
).
根据n3225
POD结构是一个既简单类又是标准布局类的类,并且没有非POD结构类型的非静态数据成员,非POD联合(或此类类型的数组).
......POD类是POD结构或POD联合的类.
这意味着
struct demo
{
private:
int a, b;
};
Run Code Online (Sandbox Code Playgroud)
是C++ 0x中的POD,因为demo
它既简单又标准.
标准布局的定义在章节中 9/7
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),也没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,
- 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类
.
那么,WindowsApi :: Uuid会成为POD类吗?
Nopes!WindowsApi::Uuid
既不是C++ 03中的POD也不是C++ 0x中的POD.一个普通的类是一个具有普通默认构造函数(12.1)并且可以轻易复制的类.WindowsApi::Uuid
有一个非平凡的默认构造函数.
那么这个规则在C++ 0x中放松了吗?
是! (考虑第11条)
AnT*_*AnT 10
C++ 03仍然不允许POD类中的非静态私有或受保护数据.此要求在聚合定义中指定
聚合是一个数组或类(第9节),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11节),没有基类(第10节),没有虚函数(10.3) ).
和POD类必须首先是聚合.
归档时间: |
|
查看次数: |
1830 次 |
最近记录: |