web-dev-qa-db-ja.com

単純なものと標準的なレイアウトとPOD

簡単に言えば、自明なタイプ、標準のレイアウトタイプ、PODの違いは何ですか?

具体的には、テンプレートパラメータTの_new T_がnew T()と異なるかどうかを確認します。 _is_trivial_、_is_standard_layout_、_is_pod_のどの特性を選択すればよいですか?

(副次的な質問として、これらのタイプの特性のいずれかをコンパイラの魔法なしで実装できますか?)

73
fredoverflow

少なくともlotの余分な説明がなければ、本当に素人の言葉でそれを行うことはできないと思います。静的な初期化と動的な初期化の1つが重要ですが、素人にはそれ自体が数ページになることを説明しています...

PODはC++ 98で(誤)定義されました。実際には2つの別個のインテントがあり、どちらも適切に表現されていません。1)C++でC構造体宣言をコンパイルした場合、得られるものはCで持っていたものと同等になるはずです。2)PODは静的を必要とする/使用するだけです(動的ではない)初期化。

C++ 0x/11では、「POD」の指定が(ほとんど)完全に削除され、「簡単な」「標準的なレイアウト」が採用されました。標準レイアウトは、最初の意図をキャプチャすることを目的としています。Cで取得するのと同じレイアウトで何かを作成します。トリビアルは、静的初期化のサポートをキャプチャすることを目的としています。

_new T_対new 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構造体です。

57
Jerry Coffin

PODタイプの場合、new T()は値初期化(すべてのメンバーを値初期化します)であり、new Tはメンバーを初期化しません(デフォルト初期化)。初期化の異なる形式間の違いについて この質問を参照 。結論:is_podが必要です。

7
Armen Tsirunyan