例:
class A
{
class B
{
A c;//error!A is an incomplete type
void test() { A b;/*OK,but why?*/ }
};
};
コードスニペットは私には奇妙に思えますが、2つの使用法の違いはA
何ですか?
[class.mem] / 6は、次のことを指定します。
クラスは
}
、クラス指定子の終了時に完全に定義されたオブジェクト型(6.9)(または完全な型)と見なされます。クラスmember-specification内では、クラスは関数本体、デフォルト引数、noexcept-specifiers、およびデフォルトメンバー初期化子(ネストされたクラスのようなものを含む)内で完全であると見なされます。それ以外の場合は、独自のクラスメンバー仕様内で不完全と見なされます。
オブジェクトの定義(A b;
またはのようにA c;
)では、オブジェクトが完全な型を持っている必要があります。上記の段落で述べたように、クラスタイプは、特定の場所、つまりメンバー関数本体の内部やその他のいくつかの場所を除いて、独自の定義内では不完全です。
このルールにより、インラインで定義されたメンバー関数内に重要なコードを記述できると同時に、クラスがそれ自体を(直接的または間接的に)含むことを禁止できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加