为什么这不是 POD

Why is this not a POD?

本文关键字:POD 这不是 为什么      更新时间:2023-10-16

这是关于std::is_pod,它检测模板是否是纯旧数据类型

请参阅以下代码:

struct A {
public:
    int m1;
    int m2;
};
struct B {
public:
    int m1;
private:
    int m2;
};
struct C {
private:
    int m1;
    int m2;
};
int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_pod<A>::value << 'n'; // true
    std::cout << std::is_pod<B>::value << 'n'; // false
    std::cout << std::is_pod<C>::value << 'n'; // true
}

对我来说,这 3 个结构看起来都像 POD。但显然struct B不是。我不明白为什么。对我来说,它们都有一个微不足道的构造函数、移动和复制运算符。析构函数当然也是微不足道的。

我把它归咎于使用了 2 个访问说明符,但我找不到有关这方面的信息。

根据标准(9 类 [类],强调我的):

标准布局类是具有以下特性的类:

对所有非静态数据成员具有相同的访问控制(第 11 条),

POD 结构是一个非联合类,它既是普通类又是标准布局类,并且......

您的预感是正确的,因为B.m1B.m2都是非静态的,并且具有不同的访问控制。