定義が完了していない不完全型(incomplete type)はsizeof
がとれないので、アロケータとそれを使用するコンテナの実装が少し難しくなる場合があります。ですが、自分自身の型のオブジェクトがいくつあるかカウントする、というような場合に以下のようなコードを書くことになり、不完全型をコンテナの要素に指定できると便利です。
struct Entry { std::list<Entry> messages; // … };
C++1zでは、以下の標準コンテナに限り、不完全型を要素とすることが許可されます:
std::vector
std::list
std::forward_list
ただし、これらのコンテナのなんらかのメンバ関数を呼び出す前には、要素型が完全型になっている必要があります。
なお、Boost Container Libraryでは1.61.0現在、static_vector
とbasic_string
以外の全てのコンテナに不完全型のサポートが入っています。(Unordered連想コンテナ、Multi-IndexといったBoost.Containerに含まれないBoostのコンテナは、その限りではありません)
参照
- N3890
Container<Incomplete Type>
- N4056 Minimal incomplete type support for standard containers
- N4371 Minimal incomplete type support for standard containers, revision 2
- N4390 Minimal incomplete type support for standard containers, revision 3
- N4510 Minimal incomplete type support for standard containers, revision 4
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。