在imperfect c++里,
書里是這樣解釋POD的:
1、 所有標量類型(基本類型和指針類型)、POD結構類型、POD聯合類型、以及這幾種類型的數組、const/volatile修飾的版本都是POD類型。
2、 POD結構/聯合類型:一個聚合體(包括class),它的非static成員都不是pointer to class member、
pointer to class member function、非POD結構、非POD聯合,以及這些類型的數組、引用、const/
volatile修飾的版本;
並且,此聚合體不能有用戶自定義的構造函數、析構函數、拷貝構造函數.
POD結構(POD-struct)是一個聚合類,它沒有以下類型的非靜態數據成員:指向成員的指針、非POD結構、非POD聯合(或以上類型的數組),或它們的引用,並且沒有用戶自定義的拷貝賦值運算符,也沒有用戶自定義的析構函數。
類似的,POD聯合(POD-union)是一個聚合聯合,它沒有以下類型的非靜態數據成員:指向成員的指針、非POD結構、非POD聯合(或以上類型的數組),或它們的引用,並且沒有用戶自定義的拷貝賦值運算符,也沒有用戶自定義的析構函數。
POD類(POD class)是一個類,它要么是POD結構,要么是POD聯合。以下幾種是POD:
1、所有基本數據類型
2、一個class或者struct,它不包含虛函數,沒有虛基類,每一個數據成員都是POD,且所有的父類(如果存在的話)都是POD
3、POD數組
4、由POD組成的union
POD可以包含非虛成員函數,當然也可以包含構造函數和(非虛)析構函數,因為這些東東都不影響對象布局。
下面這個類,它不需要copy ctor就可以拷貝構造,但不是POD:
struct S
{
std::string str; // std::string內部有指針,使用memcpy時執行淺拷貝
};
C++11中對POD的定義
當class/struct是極簡的(trivial)、屬於標准布局(standard-layout),以及他的所有非靜態(non-static)成員都是POD時,會被視為POD。
一個極簡的類別或結構符合以下定義:
- 極簡的默認建構式。這可以使用默認建構式語法,例如SomeConstructor() = default;
- 極簡的復制建構式,可使用默認語法(default syntax)
- 極簡的賦值運算子,可使用默認語法(default syntax)
- 極簡的解構式,不可以是虛擬的(virtual)
一個標准布局(standard-layout)的類別或結構符合以下定義:
- 只有非靜態的(non-static)資料成員,且這些成員也是符合標准布局的型別
- 對所有non-static成員有相同的存取控制(public, private, protected)
- 沒有虛擬函式
- 沒有虛擬基礎類別
- 只有符合標准布局的基礎類別
- 沒有和第一個定義的non-static成員相同型別的基礎類別
- 若非沒有帶有non-static成員的基礎類別,就是最底層(繼承最末位)的類別沒有non-static資料成員而且至多一個帶有non-static成員的基礎類別。基本上,在該類別的繼承體系中只會有一個類別帶有non-static成員。
