名稱查找
出自 cppreference.com
名稱查閱是程式在遇到一個名稱時,將其與引入該名稱的宣告建立關聯的程序。
例如,若要編譯 std::cout << std::endl;,編譯器會執行:
- 對名稱
std進行非限定名稱查閱 (unqualified name lookup),這會在標頭檔 <iostream> 中找到命名空間 std 的宣告 - 對名稱
cout進行限定名稱查閱 (qualified name lookup),這會在命名空間std中找到一個變數宣告 - 對名稱
endl進行限定名稱查閱,這會在命名空間std中找到一個函式樣板宣告 - 對名稱
operator<<同時進行參數相依查閱 (ADL)(這會在命名空間std中找到多個函式樣板宣告)以及對名稱 std::ostream::operator<< 進行限定名稱查閱(這會在類別 std::ostream 中找到多個成員函式宣告)。
對於函式和函式樣板名稱,名稱查閱可以將多個宣告與同一個名稱關聯起來,並可能從參數相依查閱中獲得額外的宣告。樣板引數推導也可能適用,宣告集合會被傳遞給多載解析,後者會選出最終使用的宣告。成員存取規則(若適用)僅會在名稱查閱和多載解析完成後才進行考量。
對於所有其他名稱(變數、命名空間、類別等),名稱查閱只有在這些宣告屬於同一個實體 (entity) 時才能關聯多個宣告;否則,它必須產生單一宣告,程式才能編譯通過。在作用域中對名稱進行查閱會找到該名稱的所有宣告,但有一個例外,稱為「結構駭客 (struct hack)」或「型別/非型別隱藏 (type/non-type hiding)」:在同一個作用域內,名稱的某些出現形式可能指涉一個非 typedef 的類別/結構/聯集/列舉宣告,而該名稱的其他所有出現形式要麼全部指涉同一個變數、非靜態資料成員或列舉值,要麼全部指涉可能經過多載的函式或函式樣板名稱。在此情況下,不會產生錯誤,但型別名稱會從查閱中被隱藏(程式碼必須使用詳述型別說明符來存取它)。
[編輯] 查閱的類型
如果名稱出現在作用域解析運算子 :: 的正右方,或者可能出現在 :: 後面緊跟著歧義消除關鍵字 template,請參閱
否則,請參閱
- (對於函式名稱,這包含參數相依查閱)
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| CWG 2063 | C++98 | 「結構駭客」不適用於類別作用域(破壞了 C 相容性) | 已應用 |
| CWG 2218 | C++98 | 非函式(樣板)名稱的查閱無法關聯 多個宣告,即使它們宣告的是同一個實體 |
已允許 |
[編輯] 參見
| C 文件 關於 查閱與命名空間 (Lookup and name spaces)
|