C ++標準では、さまざまなスマートポインターに対して、テンプレートパラメーターを不完全な型にすることが許可されていると指定されています。
2017以降のバージョンの標準ではvalue_type
、コンテナテンプレート、、、およびのクラステンプレートをインスタンス化するときに、アロケータタイプが「アロケータの完全性要件」を満たしている場合にのみ、コンテナを不完全なタイプにするstd::forward_list
ことstd::list
がstd::vector
できます。デフォルトのアロケータテンプレートstd::allocator
は、常にアロケータの完全性要件を満たしています。コンテナクラステンプレートのメンバーをインスタンス化するには、value_type
が完了する必要があります。
その他の標準コンテナタイプの場合、この情報は提供されません。指定されていない場合、実装は、あるコンテナクラステンプレートに対して不完全な型を受け入れ、別のテンプレートに対しては受け入れず、それでも準拠することができます。
コードを移植可能にするために、標準で特に許可されている場合を除いて、タイプが完成する前に任意のタイプのコンテナーを作成することは避けてください。
正式には、一般的な制約は、コードに適用される次のルール( [res.on.functions] )にあります。
場合によっては(置換関数、ハンドラー関数、標準ライブラリテンプレートコンポーネントのインスタンス化に使用される型の操作)、C++標準ライブラリはC++プログラムによって提供されるコンポーネントに依存します。これらのコンポーネントが要件を満たしていない場合、標準では実装に要件はありません。
特に、次の場合の影響は定義されていません。
..。
- テンプレートコンポーネントをインスタンス化するときに不完全な型がテンプレート引数として使用されている場合。ただし、そのコンポーネントで特に許可されている場合を除きます。
forward_list
、、list
およびの不完全なテンプレート引数を具体的に許可する3つのステートメントvector
は、セクション[forwardlist.overview]、[list.overview]、および[vector.overview]にあります。