2011-06-27 20 views
58

簡単に言えば、簡単なタイプ、標準のレイアウトタイプ、およびPODの違いは何ですか?単純なレイアウトと標準レイアウト対POD

具体的には、テンプレートパラメータTに対して、new Tnew T()と異なるかどうかを確認したいと考えています。どのタイプの特徴がis_trivial,is_standard_layoutおよびis_podを選択すればよいですか? 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

少なくとも私はそれは本当に平凡人の言葉では、たくさんの追加の説明のせずに行うことはできないと思う。 1つの重要な点は、静的対動的初期化ですが、一般人にはそれ自体がいくつかのページになると説明しています...

PODはC++ 98で(誤って)定義されていました。 C++でC構造体宣言をコンパイルすると、Cで宣言したものと同じでなければなりません。2)PODは、静的な使用/静的使用のみ必要です。 (動的ではない)初期化。

C++ 0x/11は、 "些細"と "標準レイアウト"を優先して(ほとんど) "POD"指定を完全に削除します。標準レイアウトは、最初のインテントをキャプチャすることを意図しています.Cと同じレイアウトのものを作成します。トリビアルは静的初期化のサポートを取得することを意図しています。

初期化と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

'trivial + standard layout = POD'は常に保持されますか? – fredoverflow

+1

@FredOverflow:はい、ただし、推移的であるため、すべての(静的でない)メンバーは簡単で標準レイアウトでなければなりません。 –

7

new T()は(価値の初期化されますすべてのメンバーを)値初期化され、そしてnew Tが初期化されませんメンバー(デフォルト - 初期化)。異なる初期化形式の違いについては、see this questionを参照してください。結論:is_podが必要です。

関連する問題