затенение функций в пространствах имен

Предположим, у вас есть следующий код

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){}определено в пространстве имен (строка 3 раскомментирована ), она затеняет более поздние определения void f(b::T){}и void f(a::S){}, но не void f(X){}. Почему?

5
задан Fabio Dalla Libera 13 August 2012 в 09:06
поделиться