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();
}

如果在命名空间 a 中定义(第 3 行未注释),它会影响andvoid f(int){}的后续定义,但不会影响。为什么?void f(b::T){}void f(a::S){}void f(X){}

4

1 回答 1

3

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

编辑。

f(int)命名空间 A 中有函数。f(A::S)全局命名空间中有函数。我们试图调用 f(s),其中 sA::S来自函数 g,它位于命名空间中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 回答