名稱空間
變體
操作

名稱查詢

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
表示式
替代表示
字面量
布林字面量 - 整數字面量 - 浮點字面量
字元字面量 - 字串字面量 - nullptr (C++11)
使用者定義 (C++11)
工具
屬性 (C++11)
型別
typedef 宣告
類型別名宣告 (C++11)
型別轉換
記憶體分配
類特有的函式屬性
explicit (C++11)
static

特殊成員函式
模板
雜項
 
 

名稱查詢是指程式中遇到名稱時,將其與引入該名稱的宣告關聯的過程。

例如,要編譯 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 文件 關於 查詢和名稱空間