所有私人成员的班级都可以成为POD班级吗?

Bil*_*eal 7 c++ pod

我之前听说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条)

另请查看聚合和PODFAQ条目

  • @bdonlan:普通类是具有普通默认构造函数(12.1)并且可以普通复制的类。 (2认同)

AnT*_*AnT 10

C++ 03仍然不允许POD类中的非静态私有或受保护数据.此要求在聚合定义中指定

聚合是一个数组或类(第9节),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11节),没有基类(第10节),没有虚函数(10.3) ).

和POD类必须首先是聚合.