首页 文章

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

提问于
浏览
5

演示是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联合(或此类类型的数组) .

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

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

2 回答

  • 3

    在C 03中,它绝对不是POD . 根据§9/ 4,“POD结构是一个聚合类...”,并根据§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结构兼容的布局保证(对于明显的示例) .

  • 13

    从最简单的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;
    }
    

    真的

相关问题