簡単に言えば、自明なタイプ、標準のレイアウトタイプ、PODの違いは何ですか?
具体的には、テンプレートパラメータT
の_new T
_がnew T()
と異なるかどうかを確認します。 _is_trivial
_、_is_standard_layout
_、_is_pod
_のどの特性を選択すればよいですか?
(副次的な質問として、これらのタイプの特性のいずれかをコンパイラの魔法なしで実装できますか?)
少なくとも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構造体です。
PODタイプの場合、new T()
は値初期化(すべてのメンバーを値初期化します)であり、new T
はメンバーを初期化しません(デフォルト初期化)。初期化の異なる形式間の違いについて この質問を参照 。結論:is_pod
が必要です。