具有私有成员的普通旧数据类型?

时间:2010-10-17 04:18:27

标签: c++ c++11 pod

Demo是否是C ++ 03中的POD类型?

struct Demo
{
     private:
       int x;
       int y;
};

C ++ 03,§9p4:

  

POD-struct是一个聚合类,它没有非POD-struct类型的非静态数据成员,非POD-union(或此类型的数组)或引用,并且没有用户定义的副本分配运算符,没有用户定义的析构函数。

阅读Steve Jessop's post后,我认为Demo是非POD,因为会员是私人的。但是,标准没有说明POD类型和访问修饰符之间的关系。

在C ++中,0x Demo是POD,因为§9p9(n3126)说:

  

POD结构是既是普通类又是标准布局类的类,并且没有非POD结构,非POD联合类型的非静态数据成员(或这种类型的数组)。

Demo是一个简单的 1 以及一个标准布局类,所以它是一个POD。我的解释是否正确?

1 一个普通的类是一个具有普通默认构造函数(12.1)并且可以轻易复制的类。 [9p5,n3126]

2 个答案:

答案 0 :(得分:13)

在C ++ 03中,它肯定是而不是一个POD。根据§9/ 4,“A POD-struct 是一个聚合类...”,并根据§8.5.1/ 1:

  

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

在C ++ 0x下,至少从N3090 / 3092开始,我相信它一个POD。这些只要求所有非静态成员具有相同的访问权限,而不是访问必须是公共的。这是为了解决我认为我是第一个指出的问题 - 在C ++ 98/03中,一个空的访问说明符导致了一个问题:

struct x { 
    int a;
public:
    int b;
public:
   int c;
};

这符合POD结构的要求 - 但由于干预访问说明符,标准仍然允许交换bc的相对位置。因此,作为POD结构不提供旨在确保与C结构兼容的布局保证(对于明显的示例)。

答案 1 :(得分:3)

从C ++ 11到目前为止最简单的方法是向编译器询问std::is_pod

#include <iostream>
#include <type_traits>

struct Demo
{
     private:
       int x;
       int y;
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_pod<Demo>::value << std::endl;
}