[英]shadowing of functions in namespaces
假設您有以下代碼
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){}
和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
,編譯器發現,該功能適用小號(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))
和全局命名空間(找到f(X)
) - 一切都好。 http://liveworkspace.org/code/c9ef24db2b5355c4484aa99884601a1a
有關更多信息,請參閱C ++標准(草案n3337)的參數3.4.2。 或者,更簡單的http://en.wikipedia.org/wiki/Argument-dependent_name_lookup
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.