找到了什麼功能
通過首先收集一組 關聯類 和 關聯名稱空間 來找到函式,這些名稱空間包括以下一個或多個,具體取決於引數型別 T
。首先,讓我們展示類,列舉和類别範本特化名稱的規則。
- 如果
T
是巢狀類,成員列舉,那麼它的周圍類。 - 如果
T
是一個列舉(這可能也成為一個類的成員!),它的最裡面的名稱空間。 - 如果
T
是一個類(它可能還可以巢狀!),它的所有基類和類本身。所有關聯類的最內層名稱空間。 - 如果
T
是ClassTemplate<TemplateArguments>
(這也是一個類!),與模板型別引數關聯的類和名稱空間,任何模板模板引數的名稱空間和任何模板模板引數的周圍類,如果模板引數是成員模板。
現在,內建型別也有一些規則
- 如果
T
是指向U
或U
陣列的指標,則與U
相關聯的類和名稱空間。示例:void (*fptr)(A); f(fptr);
,包括與void(A)
關聯的名稱空間和類(請參閱下一條規則)。 - 如果
T
是函式型別,則與引數和返回型別相關聯的類和名稱空間。示例:void(A)
將包含與A
關聯的名稱空間和類。 - 如果
T
是指向成員的指標,則與成員型別關聯的類和名稱空間(可以應用於指向成員函式的指標和指向資料成員的指標!)。示例:B A::*p; void (A::*pf)(B); f(p); f(pf);
包含與A
,B
,void(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!