2009-10-05 141 views
6

boost庫似乎是即將到來的C++ 0x標準,它定義了各種類型特徵模板來區分具有微不足道的構造函數,複製構造函數,賦值或析構函數的對象,噸。其中最重要的用途之一是優化某些類型的算法,例如,通過使用memcpy。C++:has_trivial_X類型特徵

但是,我不明白所有各種has_trivial_X模板之間的實際區別。 C++標準只定義了兩類我們在這裏關注的大類:POD和非POD。如果類型具有定義的構造函數,複製構造函數,賦值運算符或析構函數,則類型爲非POD。換句話說,任何不是內置類型或內置類型的C結構的東西都不是POD。

那麼有什麼區別,例如,has_trivial_assign和has_trivial_constructor?如果一個對象有一個不平凡的賦值運算符或一個不平凡的構造函數,它不是一個POD。那麼在什麼情況下知道一個對象有一個微不足道的賦值操作符,而且是一個不平凡的構造函數呢?

換句話說,爲什麼不定義一個單一的類型特質模板is_pod<T>,並用它來完成?

回答

6

POD類型定義在C++ 0A中得到了放寬。

一個類型可能有一個非平凡的構造函數,但可能有一個微不足道的賦值運算符。

E.g.

struct X 
{ 
    X() : y(-1) {} 
    X(int k, int v) : y(k * v) {} 

    int y; 
}; 

X可以是'memcopy'-ied,但不是平凡的構造。