什么是POD类型
下面摘自网络,不一定完全准确。
如果一个类(结构体)是平凡的,具有标准布局,且不包含任何非POD的非静态成员,那么这样的类(结构体)就是POD。
平凡的类的定义如下:
1.具有一个平凡的缺省构造器
2.具有一个平凡的拷贝构造器
3.具有一个平凡的拷贝赋值运算符
4.具有一个非虚平凡的析构器
标准布局的定义如下:
1.所有非静态数据成员均为标准布局类型
2.所有非静态成员的访问权限均相同
3.没有虚函数
4.没有虚基类
5.所有基类均为标准布局
6.要么全部基类都没有非静态数据成员,要么最下层的子类没有非静态数据成员且最多只有一个基类有非静态数据成员。总之,继承树中最多只有一个类有非静态数据成员,且所有非静态数据成员都是标准布局类型。
说了那么多依然不知道在说什么,:(.
测试代码,均在C++11环境下
template <class T>
void is_pod_value()
{
//输出1表示是POD
cout << std::is_pod<T>::value << endl;
}
class sample1
{
public:
int a;
int b;
};
class sample2
{
public:
int a;
private:
int b;
};
class sample3
{
public:
sample3(){}
//sample3(const sample3& _){}
//sample3& operator=(const sample3& t){}
//~sample3(){}
int a;
int b;
};
class sample4 : public sample1
{
public:
int c;
};
int main()
{
is_pod_value<int>(); //1
is_pod_value<sample1>(); //1
is_pod_value<sample2>(); //0,访问权限不一致
is_pod_value<sample3>(); //0,具有不平凡的/copy/operaotr/dtor
is_pod_value<sample4>(); //0继承树中有两个类有非静态成员
}
总之POD的类一眼就能看出来,如果看不出或是看不清,那一定就不是POD。
网友评论