What is C++11 POD?

问题:什么是POD?

POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与C兼容,可以使用比如memcpy()这类C中最原始的函数进行操作。C++11中把POD分为了两个基本概念的集合,即:平凡的(trival)和标准布局的(standard layout)

trival POD

通常一个平凡的类或者结构体需要满足以下定义:

  • 拥有平凡的默认构造函数和析构函数。默认的意思就是由编译器为我们自动生成的,不许是我们自己定义的,但是由于C++11提供了default,也可以是自己定义的加=default。这个要求对于带参的构造函数没有束缚。你可以自定义带参的构造函数。
  • 拥有平凡的拷贝赋值操作符和移动赋值操作符
  • 不能包含虚函数和虚基类

standard layout POD

接下来是标准布局的定义:

  • 所有非静态成员拥有相同的访问级别,(访问级别就是public,private,protected)
  • 在类和结构体继承时需要满足以下两个情况之一:
  1. 派生类中有非静态类,那么这个派生类只能有且只有一个仅包含了静态成员的基类
  2. 基类有非静态成员,那么派生类中不允许有非静态成员
  • 类中第一个非静态类型与基类不是同一个类型
  • 没有虚类和虚基类(与trival中重复)
  • 所有非静态数据成员都符合标准布局的要求,这其实就是一个递归的定义

总结

所以在C++11中,POD就是满足平凡的(trival)和标准布局(standard layout)这两个方面。可以使用<type_traits>中的is_pod<T>::value判断T是不是POD类型的。

  1. 可以使用字节赋值,比如memset,memcpy操作
  2. 对C内存布局兼容
  3. 保证了静态初始化的安全有效