找到了什麼功能

通過首先收集一組 關聯類關聯名稱空間 來找到函式,這些名稱空間包括以下一個或多個,具體取決於引數型別 T。首先,讓我們展示類,列舉和類别範本特化名稱的規則。

  • 如果 T 是巢狀類,成員列舉,那麼它的周圍類。
  • 如果 T 是一個列舉(這可能成為一個類的成員!),它的最裡面的名稱空間。
  • 如果 T 是一個類(它可能可以巢狀!),它的所有基類和類本身。所有關聯類的最內層名稱空間。
  • 如果 TClassTemplate<TemplateArguments>(這也是一個類!),與模板型別引數關聯的類和名稱空間,任何模板模板引數的名稱空間和任何模板模板引數的周圍類,如果模板引數是成員模板。

現在,內建型別也有一些規則

  • 如果 T 是指向 UU 陣列的指標,則與 U 相關聯的類和名稱空間。示例:void (*fptr)(A); f(fptr);,包括與 void(A) 關聯的名稱空間和類(請參閱下一條規則)。
  • 如果 T 是函式型別,則與引數和返回型別相關聯的類和名稱空間。示例:void(A) 將包含與 A 關聯的名稱空間和類。
  • 如果 T 是指向成員的指標,則與成員型別關聯的類和名稱空間(可以應用於指向成員函式的指標和指向資料成員的指標!)。示例:B A::*p; void (A::*pf)(B); f(p); f(pf); 包含與 ABvoid(B) 相關的名稱空間和類(對於函式型別應用了上面的專案符號)。

*所有關聯名稱空間中的所有函式和模板都可通過引數依賴查詢找到。*此外,還會找到在關聯類中宣告的名稱空間範圍友元函式,這些函式通常不可見。但是,使用指令會被忽略。

以下所有示例呼叫都是有效的,而不會通過呼叫中的名稱空間名稱限定 f

namespace A {
   struct Z { };
   namespace I { void g(Z); }
   using namespace I;

   struct X { struct Y { }; friend void f(Y) { } };
   void f(X p) { }
   void f(std::shared_ptr<X> p) { }
}

// example calls
f(A::X());
f(A::X::Y());
f(std::make_shared<A::X>());

g(A::Z()); // invalid: "using namespace I;" is ignored!