注意:この説明は上級者向けだ。
C++17では以下のコードが合法になった。このコードの挙動はC++14までは実装依存であった。
struct X
{
std::vector<X> v ;
std::list<X> l ;
std::forward_list<X> f ;
} ;
クラスはクラス定義の終了である}
を持って完全型となる。クラススコープに注入されたクラス名は、クラス定義の中ではまだ完全型ではない。不完全型をコンテナーの要素型に指定した場合の挙動は、C++14までは規定されていなかった。
C++17では、vector
, list
, forward_list
に限り、要素型に一時的に不完全型を許すようになった。実際にコンテナーを使う際には完全型になっていなければならない。