6

boost ライブラリは、今後の C++0x 標準のようですが、さまざまな型特性テンプレートを定義して、自明なコンストラクター、コピー コンストラクター、代入、またはデストラクタを持つオブジェクトと、持たないオブジェクトを区別します。これの最も重要な用途の 1 つは、たとえば memcpy を使用して、特定のタイプのアルゴリズムを最適化することです。

しかし、さまざまな has_trivial_X テンプレートすべての実際の実際の違いがわかりません。C++ 標準では、POD と非 POD という 2 つの広範なタイプのカテゴリのみが定義されています。コンストラクター、コピー コンストラクター、代入演算子、またはデストラクターが定義されている場合、型は非 POD です。つまり、組み込み型でないもの、または組み込み型の C 構造体ではないものは、POD ではありません。

では、たとえば has_trivial_assign と has_trivial_constructor を区別するポイントは何でしょうか? オブジェクトに自明でない代入演算子または自明でないコンストラクターがある場合、それは POD ではありません。では、オブジェクトに自明な代入演算子があるが、自明でないコンストラクタがあることを知っておくと、どのような状況で役立つのでしょうか?

言い換えれば、単一の型特性テンプレート を定義して、それでis_pod<T>完了しないのはなぜでしょうか?

4

1 に答える 1

6

C ++ 0Aでは、PODタイプの定義が緩和されました。

タイプには自明でないコンストラクターが含まれる場合がありますが、自明な代入演算子が含まれる場合があります。

例えば

struct X
{
    X() : y( -1 ) {}
    X( int k, int v ) : y( k * v ) {}

    int y;
};

Xは「即席爆発装置」である可能性がありますが、自明に構築することはできません。

于 2009-10-05T11:26:27.943 に答える