1. ホーム
  2. c++

[解決済み] なぜインジェクションされたクラス名があるのですか?

2022-04-27 23:36:48

質問

最近、C++の不思議な機能を見かけました。 注入されたクラス名 .

class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...

しかし、なぜこの機能が必要なのかがわからない。この機能が必要な実務はあるのでしょうか?

それに、この機能は昔のC++にはなかったと聞いています。では、いつから導入されたのでしょうか?C++03? C++11?

解決方法は?

注入されたクラス名から X のメンバーとして宣言されています。 X の内部で名前検索ができるようになります。 X は常に現在のクラスを見つけ、他の X のように、同じスコープで宣言されている可能性があります。

void X() { }
class X {
public:
  static X create() { return X(); }
};

create() 関数は、一時的な X オブジェクトを呼び出すか、関数 X ? ネームスペース・スコープでは関数を呼び出すことになるので、注入されたクラス名の目的は X というのも、名前の検索はそのクラス自身のスコープで行われ、そのスコープで検索されるからです。

また、クラス・テンプレートの内部でも有用です。注入されたクラス名は、テンプレートの引数リストなしで使用できます。 Foo の代わりに、完全なテンプレートIDである Foo<blah, blah, blah> そのため、現在のインスタンスを簡単に参照することができます。参照 DR 176 C++98とC++03の間の変更で、この点が明確になりました。

インジェクションされたクラス名という考え方はC++98にもありましたが、C++03では用語が新しくなっています。

C++98にはこうあります。

A クラス名 の直後に、それが宣言されているスコープに挿入されます。 クラス名 が見えます。class-nameはクラス自体のスコープにも挿入されます。

で2文目が変更されました。 DR 147 ということで、C++03では[class]/2に書いてあります。

A クラス名 の直後に、それが宣言されているスコープに挿入されます。 クラス名 が見えます。そのため クラス名 は、クラス自体のスコープにも挿入されます。 注入されたクラス名 .

C++98以前でも、ARMでは、クラスの名前は常にクラス本体を参照するために使用できることを意味する、ほぼ同等の文言があります。

クラス名を クラス名 の中でも メンバーリスト は、クラス指定子そのものの

  • 例えば

    class link { link* next; };