回答:
注入されたクラス名は、X
がのメンバーとして宣言されていることを意味します。そのX
ため、内部の名前検索ではX
常に現在のクラスが検出X
され、同じ囲みスコープで宣言されているクラスは検出されません。
void X() { }
class X {
public:
static X create() { return X(); }
};
されたcreate()
機能は、一時的な作成X
物を、関数を呼び出しますかX
?名前空間スコープでは、関数を呼び出すため、注入されたクラス名の目的は、名前の本文内でX
常にクラス自体を見つけることを保証することです(名前の検索は、囲みを調べる前にクラス自身のスコープで開始されるため)範囲)。
これは、クラステンプレート内でも役立ちます。たとえばFoo
、完全なtemplate-idの代わりに単に使用するなど、テンプレート引数リストなしで注入されたクラス名を使用できるFoo<blah, blah, blah>
ため、現在のインスタンス化を簡単に参照できます。それを明確にしたC ++ 98とC ++ 03の間の変更点については、DR 176を参照してください。
注入されたクラス名のアイデアはC ++ 98に存在していましたが、C ++ 03の用語は新しいものでした。
C ++ 98さんのコメント:
クラス名は、直後に宣言された範囲内に挿入されたクラス名が見られています。クラス名もクラス自体のスコープに挿入されます。
2番目の文はDR 147によって変更されたため、C ++ 03は[クラス] / 2で次のように述べています。
クラス名は、直後に宣言された範囲内に挿入されたクラス名が見られています。クラス名は、クラス自体の範囲に挿入されます。これは、注入されたクラス名として知られています。
C ++ 98より前でも、ARMにはほぼ同等の表現があり、クラスの名前をクラス本体で常に使用してクラス自体を参照できることを意味します。
クラスの名前は、クラス指定子自体のメンバーリスト内でもクラス名として使用できます。
- 例えば、
class link { link* next; };