首頁 > 後端開發 > C++ > 為什麼 C 函數範本的參數相關查找 (ADL) 失敗?

為什麼 C 函數範本的參數相關查找 (ADL) 失敗?

Mary-Kate Olsen
發布: 2024-12-11 08:48:11
原創
729 人瀏覽過

Why Does Argument-Dependent Lookup (ADL) Fail for C   Function Templates?

ADL 查找函數範本失敗

在C 中,參數相關查找(ADL) 可以在函數範本中搜尋函數名稱的聲明與函數呼叫中的參數關聯的命名空間。然而,C 規範中對於函數模板和 ADL 是有限制的。

限制

根據 C 標準 14.8.1.6,ADL 沒有適用於函數模板,除非在呼叫時存在同名的可見函數模板。這意味著,對於具有明確模板參數的函數模板,呼叫必須具有帶有可見函數模板的正確語法形式。

範例

考慮以下範例:

namespace ns {
    struct foo {};
    template<int i> void frob(foo const&amp;) {}
    void non_template(foo const&amp;) {}
}

int main() {
    ns::foo f;
    non_template(f); // This is fine.
    frob<0>(f); // This is not.
}
登入後複製

在此範例中,ADL 尋找並解析第一次呼叫的non_template,因為non_>在此範例中,ADL 尋找並解析第一次呼叫的non_template,因為non_>在這個範例中,ADL 尋找並解析第一次呼叫的non_template,因為non_>在這個範例中,ADL 尋找並解析第一次呼叫的non_template,因為non_>是一個普通函數。然而,對於第二次調用,frob 是一個函數模板。由於呼叫時沒有可見的 frob 函數模板,ADL 失敗,且呼叫在語法上格式不正確。

解決限制

至克服這個限制,確保函數模板在呼叫範圍內可見。這可以透過在目前命名空間中聲明函數模板或使用包含函數模板的命名空間來限定呼叫來實現。

以上是為什麼 C 函數範本的參數相關查找 (ADL) 失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板