命名空間
變體
動作

名稱查找

出自 cppreference.com
< cpp‎ | language
 
 
C++ 語言
一般主題
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

名稱查閱是程式在遇到一個名稱時,將其與引入該名稱的宣告建立關聯的程序。

例如,若要編譯 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)
English Deutsch 日本語 中文(简体) 中文(繁體)