adl(koenig)查詢
adl,引數相關查詢,也稱作為
koenig
查詢(以
andrew koenig
的名字命名),是指在編譯器對無限定域的函式呼叫進行名字查詢時,所應用的一種查詢規則。
首先來看乙個函式所在的域的分類: 1
:類域(函式作為某個類的成員函式(靜態或非靜態)) 2
:名字空間域 3
:全域性域 而
koenig
查詢,它的規則就是當編譯器對無限定域的函式呼叫進行名字查詢時,除了當前名字空間域以外,也會把函式引數型別所處的名字空間 加入查詢的範圍。
adl就是為了確保使用型別
x的物件
x時能夠像使用
x的成員函式一樣簡單
(ensure that code that uses an object
x of type
x can use its nonmember function inte***ce as easily as it can use member functions)。
根據adl
規則,如果非成員函式想和型別一起被使用,應該將它們置於同乙個名字空間中。換句話說,和型別
x放在同一名字空間下的非成員函式,也是
x介面的一部分。
(常見的有
<>
操作符)
示例:#include
//class n // 類域
//;
// void f(e)
//
//};
namespace n;
void f(e) }
void f(int)
int main()
上述例子,如果n為
class
,輸出為:
::f(int) called
;如果n
為名字空間,輸出:
n::f(n::e) called。
也就是說
adl僅會將引數所在的名字空間中的函式名字加入查詢範圍。
呼叫函式時,顯式地限定名字空間將禁用
adl查詢,加快解析過程。
C 再學習系列 前置 與後置
前置 type operator 後置 const type operator int 為了編譯器區分前置和後置 c 規定字尾形式有乙個int型別引數 當函式被呼叫時,編譯器傳遞乙個0做為int引數的值給該函式。不這樣規定,無法區分,因為都僅以自身物件為入參。下面是乙個簡單的例子 上面的實現解釋了乙...
C 再學習系列 指標和引用
原題目 使用合理的引用引數實現介面的自說明 在引用和指標的小文中,主要討論了引用和指標語法層面上的區別。本文將側重如何更加合理地利用語言對引用所作限制。在c 中,指標是最靈活的,也是最危險的。在程式設計當中,可使用const對指標做限制。const type var var指標變數指向乙個const...
C 再學習系列 異常安全性
異常安全性 異常安全保證有3種 a 基本保證 保證不會發生資源洩露,即使操作失敗 但是狀態可能發生改變。b 強保證 事務提交 回滾語義 即使操作失敗也不會導致程式狀態改變。c 無失敗保證 不允許失敗發生。即絕對不會拋異常。準則 函式應該總是支援它所能支援的最強的異常安全保證,但是前提是不能給那些並不...