簡體   English   中英

命名空間中的函數陰影

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM