私はBjarne StroustrupのThe C++ Programming Languageのネームスペースの章を読んで、引数依存の参照を使って関数がどのように呼び出されるのか混乱しました。クロノは、関数fの引数に使用される名前空間ですので、それはフォーマットのために成功裏に検索されるので、このコードは、私には理にかなってC++で名前空間と引数依存ルックアップについて混乱しました
スニペット1
namespace Chrono {
class Date { /* ... */ };
bool operator==(const Date&, const std::string&);
std::string format(const Date&); // make string representation
// ...
}
void f(Chrono::Date d, int i)
{
std::string s = format(d); // Chrono::format()
std::string t = format(i); // error: no format() in scope
}
:次は本からのコードスニペットです(日付)機能を使用します。 1(
スニペット2
namespace N {
struct S { int i };
void f(S);
void g(S);
void h(int);
}
struct Base {
void f(N::S);
};
struct D : Base {
void mf();
void g(N::S x)
{
f(x); // call Base::f()
mf(x); // call D::mf()
h(1); // error: no h(int) available
}
};
これはライン「Hまで、私には意味を構成する:また、関数fと名前空間クロノは、次のスニペットについての私を混乱させる同じスコープを、共有して表示されます); "構造体と名前空間Nの両方が同じスコープを共有しているので、なぜ "void h(int)"という関数が名前空間Nに見つからないのですか?
Stroustrupは、「引数が名前空間のメンバである場合、関連付けられた名前空間は囲む名前空間です」と言い続けています。 gへの引数は名前空間Nのメンバであるため、これは囲み名前空間が関数 "h(int)"を含まないグローバル名前空間であることを意味しますか?その場合、「フォーマット(日付)」関数も含まれていないグローバル名前空間が囲んでいる名前空間である場合、スニペット1は失敗しないのはなぜですか?
この問題についての洞察を事前にお寄せいただきありがとうございます。
ここで重要なのは、ADLからのAです。** A ** rgument。 1は '名前空間N 'にない型int型です。 – Jarod42
""引数が名前空間のメンバである場合 "は呼び出される関数の引数を指します –