2

ここで定義されているように、PODは、ユーザー定義のコンストラクターや非静的メンバーを持たず、単純なデータ型のみを含む単純なクラスです。

問題は、以下の 2 つのクラスが(メモリ フットプリントの点で) POD型と同等になるかどうかです。

class pod
{
public:
   int x;
   double y;
};

class pod1
{
public:
   int x;
   double y;

   enum POD_TYPE
   {
      POD1 = 0,
      POD = 1
   };
};

つまり、列挙型をクラスに追加すると、列挙型のスコープ解決にのみ影響し、クラス自体のプロパティには影響しませんか? 観察ではクラスはまだポッドのようですが、基準に基づいて確認したいと思います。

4

3 に答える 3

3

はい、そのタイプはまだ POD です。定義は C++11 9/10 によって与えられます。

POD 構造体は、自明クラスと標準レイアウト クラスの両方である非共用体クラスであり、型非 POD 構造体、非 POD 共用体 (またはそのような型の配列) の非静的データ メンバーはありません。

些細なこととは、オブジェクトの作成、破棄、またはコピー時に面白いことをしないことを意味します。標準レイアウトとは、データ メンバーのレイアウトに関しておかしなビジネスを行わないことを意味します。ポリモーフィズムがなく、アクセス指定子と継承でできることの制限がありません。詳細が必要な場合は、これらの用語は C++11 9/6 および 9/7 で完全に定義されています。

ネストされた型 (列挙型など)、静的データ メンバー、および非仮想メンバー関数 (自明ではないコンストラクターなどを除く) は、これらのいずれにも影響しないため、POD のままです。

更新:歴史的な定義に興味があるとおっしゃっているので、C++03 では次のように定義されています。

9/4 POD 構造体は、非 POD 構造体、非 POD 共用体 (またはそのような型の配列) 型の非静的メンバーを持たず、ユーザー定義のコピー代入演算子も持たない集約クラスです。ユーザー定義デストラクタ」

8.5.1/1 集合体は、ユーザーが宣言したコンストラクター、プライベートまたは保護された非静的データ メンバー、基底クラス、および仮想関数を持たない配列またはクラスです。

そのため、より多くの制限がありました。ただし、ネストされた型は引き続き許可されていました。私は C++98 のコピーを持っていませんが、C++03 と同じであることは確かです。

于 2013-10-25T12:52:11.240 に答える
2

enumネストされたを定義してもデータメンバーがクラスに追加されないため、POD ステータスに関して違いはありません。実際、内部で PODではないネストされたクラスを定義することもできますが、pod1それでも の POD 性に関して違いはありませんpod1

于 2013-10-25T12:45:34.263 に答える
1

列挙 POD_TYPE型は型であり、レイアウトには影響しません。これは、ドラフト C++ 標準セクション9.2 クラス メンバーパラグラフ1からわかります。

[...]クラスのメンバーは、データ メンバー、メンバー関数 (9.3)、ネストされた型、および列挙子です。データ メンバーとメンバー関数は、静的または非静的です。9.4 を参照してください。ネストされた型は、クラス (9.1、9.7) と列挙型 (7.2) [...]

データメンバーとは対照的に、標準レイアウトクラスの定義は、パラグラフ16のデータメンバーのみに依存することがさらにわかり ます。

2 つの標準レイアウト構造体 (条項 9) 型は、同じ数の非静的データ メンバーを持ち、対応する非静的データ メンバー (宣言順) がレイアウト互換型 (3.9) を持っている場合、レイアウト互換性があります。

9 さらに、セクションクラスの段落10に戻ると、次のように述べられています(強調鉱山):

POD struct108、自明クラスおよび標準レイアウトクラスの両方である非共用体クラスであり、非POD構造体、非POD共用体(またはそのような型の配列)型の非静的データメンバを持たない。同様に、POD 共用体は自明クラスと標準レイアウト クラスの両方である共用体であり、型非 POD 構造体、非 POD 共用体 (またはそのような型の配列) の非静的データ メンバーはありません。POD クラスは、POD 構造体または POD 共用体のいずれかであるクラスです。

私が知る限り、C++11 より前の標準は上記の項目に大きな違いはありません。

于 2013-10-25T13:22:49.203 に答える