23

私は2つのコンパイラでテストしましたが、どちらも文句なしに次の定義をサポートしていることに驚きました。

class A {
  A();
};

A::A::A() {}
   ^^^

これはメソッドでも成功しますが、宣言が過剰に修飾されている場合はフラグが付けられることに注意してください。

質問:

  • これは有効なC++プログラムですか?
  • もしそうなら、それはどのような目的に役立ちますか?それとも単なる副産物ですか?

更新された詳細:

元の質問が明確でないか短すぎる場合:定義で冗長な資格が許可されている理由に興味があります(強調も上に追加されています)。


ClangaAppleのGCC4.2+LLVMがコンパイラでした

4

1 に答える 1

18

はい、許可されています(§9/ 2):

クラス名は、クラス自体のスコープにも挿入されます。これは、注入されたクラス名として知られています。アクセスチェックの目的で、注入されたクラス名は、パブリックメンバー名であるかのように扱われます。

クラス名の挿入につながる理由については、N0444をお読みください。

于 2012-08-27T02:07:53.813 に答える