命名空间中的函数阴影

Fab*_*era 5 c++ namespaces method-hiding

假设您有以下代码

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();
}
Run Code Online (Sandbox Code Playgroud)

如果void f(int){}在名称空间中的(线3未被注释)中所定义,它阴影的后面的定义void f(b::T){}void f(a::S){},但不是void f(X){}.为什么?

For*_*veR 3

它会隐藏f(char)并被f(int)调用,因为 char 可以隐式转换为 int。 http://liveworkspace.org/code/8d7d4e0bc02fd44226921483a910a57b

编辑。

命名空间 A 中有函数。全局命名空间中f(int)有函数。f(A::S)我们尝试调用 f(s),其中 s 来自A::S函数 g,该函数位于名称空间中A,编译器发现该函数应应用 S (A::S),但名称空间中没有这样的函数A,因此编译器停止并给出错误。 http://liveworkspace.org/code/5f989559d2609e57c8b7a655d5b1cebe

全局命名空间中有函数f(B::T)。尝试在命名空间 A 和命名空间 B 中查找(f(int))(因为 arg-type 在命名空间 B 中),但没有找到任何内容,编译器停止。 http://liveworkspace.org/code/4ebb0374b88b29126f85038026f5e263

全局命名空间中有函数f(X)X在全局命名空间中,查看命名空间 A(f(int))和全局命名空间( find f(X)) - 一切都好。 http://liveworkspace.org/code/c9ef24db2b5355c4484aa99884601a1a

有关详细信息,请阅读 C++ 标准(草案 n3337)的第 3.4.2 部分。或者,更简单地http://en.wikipedia.org/wiki/Argument-dependent_name_lookup