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

时间:2011-01-21 19:10:15

标签: 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; }
    };
}

3 个答案:

答案 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条)

另请查看FAQ entry on Aggregates and PODs

答案 2 :(得分:-1)

根据我的n3225 C ++ 0x草案,WindowsApi::Uuid是一个POD类。

从第219页开始: POD结构是一个既简单的类又是标准布局类的类,并且没有非POD结构类型的非静态数据成员,非POD联合(或此类类型的数组)。

一个普通的类是一个具有普通默认构造函数的类,并且可以轻易地复制:

一个简单的可复制类是一个类:

  • 没有非平凡的副本构造函数(12.8),
  • 没有非平凡的移动构造函数(12.8),
  • 没有非平凡的复制赋值运算符(13.5.3,12.8),
  • 没有非平凡的移动赋值运算符(13.5.3,12.8)和
  • 有一个简单的析构函数(12.4)。

标准布局类是一个类:

  • 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
  • 没有虚函数(10.3),没有虚基类(10.1),
  • 对所有非静态数据成员具有相同的访问控制(第11条)
  • 没有非标准布局基类
  • 在派生程度最高的类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有包含非静态数据成员的基类,并且
  • 没有与第一个非静态数据成员相同类型的基类。

由于WindowsApi没有违反任何这些约束,因此它将是C ++ 0x下的有效POD类。正如AndreyT所提到的,这是比C ++ 03更慷慨的措辞。