PODタイプであることは、単純な標準レイアウトタイプであることとまったく同じですか?


22

C ++ 20では、PODの概念は推奨されません。これは、それがささいで標準的なレイアウトであるという意味のない複合特性であるためと考えられます。ただし、C ++ 20ドラフトでのPODの定義は、厳密には「単純なものと標準的なレイアウトの両方」ではありません。実際には:

PODクラスは、自明なクラスと標準レイアウトクラスの両方であり、非PODクラス(またはその配列)タイプの非静的データメンバーを持たないクラスです。PODタイプは、スカラータイプ、PODクラス、そのようなタイプの配列、またはこれらのタイプのいずれかのcv修飾バージョンです。

言い換えれば、PODタイプは単純で標準的なレイアウトであるだけでなく、再帰的にもそうです。

この再帰的な要件は冗長ですか?言い換えれば、型が自明で標準的なレイアウトでもある場合、それは自動的に再帰的に自明で標準的なレイアウトでもありますか?答えが「いいえ」の場合、PODに失敗した標準レイアウトの自明なタイプの例は何ですか?

回答:


12

C ++ 20では、PODの概念は推奨されません。これは、それが些細で標準的なレイアウトであるという意味のない複合特性であるためと考えられます。

不正解です。PODという用語は、重要ではなくなったため廃止されました。

PODという用語は、標準ではもはや目的を果たさず、単に定義されており、他のいくつかのタイプがこの痕跡特性を保持する場合に制限が適用されます。

基本的に、平凡で標準的なレイアウトであるタイプは、自明で標準的なレイアウトであること自体が提供する以上の能力を獲得しません。2つの組み合わせは、型を特別なものにするわけではありません。また、2つのプロパティは、実際には互いにあまり関係がありません。

標準レイアウトとは、空でないサブオブジェクトのレイアウトが明確に定義されていること(および空の基本クラスサブオブジェクトがタイプのレイアウトを妨げないこと)です。自明性とは、オブジェクトが、格納するビットのブロックを超えて何らかの意味を持っているかどうか(任意のビットのブロックで初期化されている場合、概念的には有効なオブジェクトかどうか)です。

タイプを取るテンプレートを作成していて、そのタイプのオブジェクトがT可能かどうかを確認したい場合memcpy、そのメンバーのレイアウトは気にしません。TriviallyCopyableかどうかを知りたい。同様に、offsetofクラスにユーザー指定のコピーコンストラクターがある場合、の正確さはほとんど気になりません。重要なのは、メンバーサブオブジェクトのレイアウトが標準の強制された明確な順序で発生するかどうかだけです。

基本的に、人々は周りを見回してみると、C ++には、単純さと標準レイアウトの共通部分を特に必要とするものは何も残っていないことに気付きました。そのため、期間を予約する必要はありません。いくつかのタイプが「POD」になると規格が明確に述べているこれらのいくつかの場所は、必要に応じて、単純な「標準レイアウト」に単に置き換えることができます。

この再帰的な要件は冗長ですか?

両方の構成要件は個別に再帰的であるため、2つの交差部分も再帰的です。したがって、すべてのサブオブジェクトもPODであることを明示的に示す必要はありません。これは、コピーアンドペーストの奇妙なケースである可能性が高いだけでなく、元の定義では「すべての非静的データメンバーはPOD型である必要があります」のようなものであり、そのステートメントをそのまま保持していました。


「重要なのは、メンバーサブオブジェクトのレイアウトが明確な標準の強制順序で発生するかどうかだけです」なぜstdは、メンバーのオフセットを決定できるように順序を強制する必要があるのでしょうか。stdの目的は、メンバーがオフセットを持たないクレイジーな実装を許可することですか?
curiousguy

1

標準レイアウトは、非静的メンバーの標準レイアウトに依存します。

[class.prop]

次の場合、クラスSは標準レイアウトクラスです。

  • 非標準レイアウトクラス(またはそのようなタイプの配列)または参照のタイプの非静的データメンバーがない

  • ...

自明性は、非静的メンバーの自明性にも依存します。簡潔にするために、デフォルトコンストラクターのルールのみを引用しましたが、他の特別なメンバー関数にも同様の表現があります。

[class.default.ctor]

デフォルトのコンストラクターは、ユーザーが指定していない場合、および次の場合に簡単です。

  • ...
  • クラス型(またはその配列)であるそのクラスのすべての非静的データメンバーの場合、そのような各クラスには自明なデストラクタがあります。

私の知る限りでは、メンバーに適用するPODnessの明示的な要件は冗長です。これは、標準のレイアウトとささいな要件から暗黙的に従うためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.