2012-08-27 6 views
22

私は2つのコンパイラでテストされ、そして文句なし定義以下の両方をサポートして見て驚きました。コンパイラで冗長スコープの資格がサポートされているのはなぜですか?宣言は上の修飾されたときにそれはフラグが立てられているが、これはまた、メソッドのために成功したことを</p> <pre><code>class A { A(); }; A::A::A() {} ^^^ </code></pre> <p>注:

質問:

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

更新の詳細:

場合、元の質問は、透明または短すぎませんでした:冗長資格が定義(また、上記のように強調)で許可されている理由を、私は好奇心が強いです。


クランAppleのGCC 4.2 + LLVMは

+1

これは尋ねられましたが、私はそれがいくつかよりも見つけるのは難しいと思っています。 – chris

+0

@chris私はいくつかのページを見ていましたが、何も見つかりませんでした。おそらく私はちょうど適切な用語を使用して検索しませんでした。 – justin

+2

これは*役立つかもしれません:http://stackoverflow.com/questions/11423380/why-are-redundant-class-name-qualifiers-allowed – chris

答えて

18

はい、それは許可されていますコンパイラ(§9/ 2)であった:クラス名は、スコープ内に挿入される

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

クラス名の挿入につながる推論については、N0444を参照してください。

+0

ありがとうございます(+1) - 私は*定義*が私にとって本当に興味があった部分(あなたの答えが変わらないかもしれないことに気づきます)。 – justin

関連する問題

 関連する問題