5

次のコードがあるとします

namespace a{
  struct S{};
  //void f(int){}
}

namespace b{
  struct T{};
}


struct X{};

void f(X){}
void f(b::T){}
void f(a::S){}



namespace a{
  void g(){

    S s;b::T t; 
    X x;
    f(x);
    f(s);
    f(t);
  }

}

int main(){
  a::g();
}

void f(int){}名前空間aで定義されている場合(3行目はコメントされていません)、以降のvoid f(b::T){}andの定義をシャドウしますが、。はシャドウしvoid f(a::S){}ませんvoid f(X){}。なんで?

4

1 に答える 1

3

charは暗黙的にintにキャストできるため、 シャドウf(char)されて呼び出されます。http://liveworkspace.org/code/8d7d4e0bc02fd44226921483a910a57bf(int)

編集。

f(int)名前空間Aに関数がありf(A::S)ます。グローバル名前空間に関数があります。A::Ssが名前空間にある関数gからのものであるf(s)を呼び出そうとするとA、コンパイラはその関数がSを適用することを検出しますが、(A::S)名前空間にそのような関数がないAため、コンパイラは停止してエラーを出します。 http://liveworkspace.org/code/5f989559d2609e57c8b7a655d5b1cebe

f(B::T)グローバル名前空間に関数があります。名前空間A(f(int))と名前空間Bで検索しようとすると(arg-typeは名前空間Bにあるため)、何も見つかりませんでした。コンパイラは停止します。 http://liveworkspace.org/code/4ebb0374b88b29126f85038026f5e263

f(X)グローバル名前空間に関数があり、グローバル名前空間にXあり、名前空間A(f(int))とグローバル名前空間(find f(X))を見てください-すべて大丈夫です。 http://liveworkspace.org/code/c9ef24db2b5355c4484aa99884601a1a

詳細については、C ++標準のパラメーター3.4.2(ドラフトn3337)をお読みください。または、もっと簡単にhttp://en.wikipedia.org/wiki/Argument-dependent_name_lookup

于 2012-08-13T09:06:17.147 に答える