C 再學習系列 ADL Koenig 查詢

2021-04-30 02:41:49 字數 1099 閱讀 6998

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 無失敗保證 不允許失敗發生。即絕對不會拋異常。準則 函式應該總是支援它所能支援的最強的異常安全保證,但是前提是不能給那些並不...