繁体   English   中英

一个包含所有私有成员的类可以是一个 POD 类吗?

[英]Can a class with all private members be a POD class?

我之前听说 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; }
    };
}

我之前听说 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 类吗?

不! WindowsApi::Uuid在 C++03 和 C++0x 中都不是 POD。 平凡类是具有平凡默认构造函数(12.1) 且可简单复制的类。 WindowsApi::Uuid有一个重要的默认构造函数。

那么这个规则在 C++0x 中放松了吗?

是的! (考虑到第 11 条)

另请查看有关聚合和 POD常见问题解答条目

C++03 仍然不允许在 POD 类中使用非静态私有或受保护的数据。 该要求在聚集体的定义中指定

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

并且 POD 类必须首先是一个聚合。

根据我的 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 更慷慨的措辞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM