1. ホーム
  2. c++

[解決済み] トリビアル vs. スタンダードレイアウト vs. POD

2023-05-18 05:30:52

質問

平たく言うと、トリビアルタイプ、スタンダードレイアウトタイプ、PODの違いは何でしょうか?

具体的には new T とは異なるかどうかを判断したい。 new T() は、どのテンプレートパラメータに対しても T . どの型特性 is_trivial , is_standard_layoutis_pod を選べばいいのでしょうか?

(余談ですが、これらの型特性はコンパイラの魔法なしで実装できるのでしょうか?)

どのように解決するのか?

本当に素人考えで出来るとは思えません、少なくとも ロット の余分な説明がなければ。重要なポイントの 1 つは、静的な初期化と動的な初期化ですが、素人にそれを説明するとそれだけで数ページになってしまいます...。

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

C++0x/11 では、quot;POD" の指定が (ほとんど) 完全になくなり、quot;trivial" および "standard layout" が使用されるようになりました。標準レイアウトは、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構造体です。