ADL 和函數模板
參數相關查找(ADL) 透過促進函數和物件的自動查找C 中發揮重要作用基於所使用的參數類型的關聯命名空間。然而,這種機制在函數模板方面有其限制。
使用 ADL 尋找函數範本的限制
提供的程式碼片段中的最後一個呼叫由於無法編譯而失敗C 規範中的限制。根據C 標準03 第14.8.1.6 節:
「但是,當使用具有明確模板參數的函數模板時,調用不具有正確的語法形式,除非存在具有該名稱的函數模板可見在調用點。在給定的範例中,frob是對具有明確模板參數的函數模板的呼叫。但是,在 main 中呼叫時沒有可見的 frob 模板宣告。
與簡單函數名稱的區別此限制不適用於簡單函數函數名稱。對於此類名稱,即使函數在呼叫範圍內不可見,也會使用 ADL。這是因為該呼叫仍然保持函數呼叫的語法形式。
範例以下範例進一步說明了該行為:
在此範例中,對f 3 (b) 的呼叫格式錯誤,因為此時不存在名為f 的可見函數模板。對 A::f 3 (b) 的呼叫格式良好,因為 f 範本在 A 命名空間內可見。對 C::f 3 (b) 的呼叫格式不正確,因為 ADL 僅適用於非限定名稱。使用 using 指令來別名 C::f 使得對 f(b) 的呼叫格式良好,因為 f 名稱現在在呼叫時可見。以上是為什麼參數相關查找 (ADL) 無法找到具有明確範本參數的函數範本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!