2011-06-27 31 views
58

通俗地說,平凡類型,標準版式與POD之間有什麼區別?普通版與標準版對比POD

具體而言,我想確定new T對於任何模板參數T是否與new T()不同。我應該選擇哪種類型的性狀is_trivialis_standard_layoutis_pod

(作爲一個方面的問題,可在任何該等型性狀在沒有編譯器魔術實施?)

+0

我覺得它有點遲到來提這個。但對於需要詳細闡述的答案的人來說,這裏是鏈接。通過R Martinho Fernandes檢查答案http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special/4178176#4178176 – jmishra

回答

52

我不認爲這可以用真正的外行人的話來說,至少沒有很多的額外解釋。重要的一點是靜態初始化和動態初始化,但是向外行解釋說它本身就是幾頁......

PODs在C++ 98中被定義(錯誤)。實際上有兩個獨立的意圖,都不是很好表達:1)如果你用C++編譯一個C結構聲明,你得到的應該等同於你在C中的含義。2)一個POD將只需要/使用static (不是動態的)初始化。

C++ 0x/11完全拋棄了「POD」的稱號,而贊成「平凡」和「標準佈局」。標準佈局旨在捕獲第一個意圖 - 使用與您在C中獲得的佈局相同的佈局創建某些內容。Trivial旨在捕獲對靜態初始化的支持。

由於new Tnew T()涉及初始化,您可能is_trivial

我不確定需要編譯器魔法。我的直接反應可能是肯定的,但知道人們用TMP所做的一些事情,我很難確定有人不能這樣做......

編輯:例如,也許最好是隻是引用的例子來自N3290:

struct N { // neither trivial nor standard-layout 
    int i; 
    int j; 
    virtual ~N(); 
}; 

struct T { // trivial but not standard-layout 
    int i; 
private: 
    int j; 
}; 

struct SL { // standard-layout but not trivial 
    int i; 
    int j; 
    ~SL(); 
}; 

struct POD { // both trivial and standard-layout 
    int i; 
    int j; 
}; 

正如你可以猜測毫無疑問,POD也是一個POD結構。

+0

+1,由我的閱讀'is_trivial'是正確的答案。 – ildjarn

+0

那麼'瑣碎的+標準佈局= POD'總是成立? – fredoverflow

+1

@FredOverflow:是的,只是它是可傳遞的,所以所有(非靜態)成員都必須是簡單的+標準佈局。 –

7

對於POD類型new T()是值初始化(將值初始化所有成員),並new T不會初始化成員(默認初始化)。針對不同形式的初始化see this question之間的差異。底線:您需要is_pod