名稱查詢
來自 cppreference.com
名稱查詢是指程式中遇到名稱時,將其與引入該名稱的宣告關聯的過程。
例如,要編譯 std::cout << std::endl;,編譯器會執行:
- 對名稱
std
進行非限定名稱查詢,這會在標頭檔案 <iostream> 中找到名稱空間 std 的宣告。 - 對名稱
cout
進行限定名稱查詢,這會在名稱空間std
中找到一個變數宣告。 - 對名稱
endl
進行限定名稱查詢,這會在名稱空間std
中找到一個函式模板宣告。 - 對名稱
operator<<
同時進行實參依賴查詢(它在名稱空間std
中找到多個函式模板宣告)和對名稱 std::ostream::operator<< 進行限定名稱查詢(它在類 std::ostream 中找到多個成員函式宣告)。
對於函式和函式模板名稱,名稱查詢可以將多個宣告與同一個名稱關聯,並可能從實參依賴查詢中獲取額外的宣告。模板實參推導也可能適用,宣告集被傳遞給過載決議,過載決議會選擇將要使用的宣告。如果適用,成員訪問規則僅在名稱查詢和過載決議之後考慮。
對於所有其他名稱(變數、名稱空間、類等),名稱查詢只有在它們宣告同一實體時才能關聯多個宣告,否則它必須生成單個宣告才能使程式編譯。在作用域中查詢名稱會找到該名稱的所有宣告,但有一個例外,稱為“結構體駭客”或“型別/非型別隱藏”:在同一作用域內,名稱的一些出現可能指代不是typedef的類/結構體/聯合體/列舉體的宣告,而同一名稱的所有其他出現要麼都指代同一個變數、非靜態資料成員或列舉器,要麼都指代可能過載的函式或函式模板名稱。在這種情況下,沒有錯誤,但型別名稱被從查詢中隱藏(程式碼必須使用詳細型別說明符才能訪問它)。
[編輯] 查詢型別
如果名稱緊跟在作用域解析運算子 ::
的右側,或者可能在 ::
之後跟著消歧關鍵字 template
,請參見:
否則,請參見:
- (對於函式名稱,這包括實參依賴查詢)
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
CWG 2063 | C++98 | "結構體駭客"不適用於類作用域(破壞C相容性) | 已應用 |
CWG 2218 | C++98 | 非函式(模板)名稱的查詢無法關聯 多個宣告,即使它們宣告的是同一個實體 |
允許 |
[編輯] 另請參見
C 文件 關於 查詢和名稱空間
|