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){}.为什么?
它会隐藏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