今回、実引数依存の名前探索(以下ADL)について2つお聞きしたいことがあり、質問させていただきました。
①クラス内部で定義されたfriend関数について
以下のようなコードはADLのおかげでコンパイルできます。
自分にとって細かい規格を理解することは、まだなかなか難しいのですが一応ADLの仕様にこう書いてあるからだと理解しました
if they are not visible during an ordinary lookup というのがどういった場合かという実例は、main関数内でFooをA::Foo( h )と修飾してAny namespace-scope friend functions or friend function templates declared in associated classes are visible within their respective namespaces even if they are not visible during an ordinary lookup (11.3).
呼び出したときにコンパイルが通らないことだと思います。これはおそらく
という部分に記載されていることかと考えました。The name of the friend is not found by unqualified lookup (3.4.1) or by qualified lookup (3.4.3)
until a matching declaration is provided in that namespace scope (either before or after the class definition
granting friendship).
質問:
上記の理解は間違っているのでしょうか?それとも正しいのでしょうか?
はたまたどうしてこういう仕様になっているのか(つまりADLでなくては呼び出せないという一見奇妙に思える仕様)、
その理由をご存知でしたら教えていただきたいと思います
②テンプレート引数にADLが侵入してくるということについて
→②クラステンプレートにおけるテンプレート実引数にADLが適用されることについて
比較的よく知られた例だと思いますが、以下のコードはA::Fooと表示されます。
http://d.hatena.ne.jp/uskz/20060526/p1
で紹介されているとおりです。
質問:
どうしてクラステンプレートにおける(←追加)
テンプレート実引数にまでADLが侵入してくるという仕様になっているのでしょうか?
この仕様によって得られるメリットは何でしょうか?
以上です。
もしご存知の方がいらっしゃいましたらよろしくお願いいたします。