首頁 >後端開發 >C++ >為什麼在 C 中參數依賴查找無法找到具有顯式模板參數的函數模板?

為什麼在 C 中參數依賴查找無法找到具有顯式模板參數的函數模板?

Patricia Arquette
Patricia Arquette原創
2024-12-09 05:42:10915瀏覽

Why Does Argument Dependent Lookup Fail to Find Function Templates with Explicit Template Arguments in C  ?

C 中的參數相關查找和函數模板

參數相關查找(ADL) 是一種語言功能,使編譯器能夠搜尋標識符在與函數呼叫的參數關聯的命名空間內。雖然 ADL 通常會尋找函數,但在某些情況下無法找到函數範本。

C 標準解釋

C 標準 (2003) 第 14.8.1.6節指出那:

「但是當使用帶有明確模板參數的函數模板時,調用沒有正確的語法形式,除非在調用時存在具有該名稱可見的函數模板。如果沒有可見的此類別名稱,則該呼叫在語法上不正確,並且依賴參數的查找不適用。 🎜>範例

考慮以下範例:

main 中的最後一個呼叫(frob(f);) 無法編譯,因為在呼叫範圍內沒有名稱為frob 的函數模板可見。 ADL 找不到 frob;因為編譯器的語法不認為函數模板是有效的函數呼叫。

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 仍然可以找到函數模板,即使其名稱不可見。

    但是,如果使用明確模板參數呼叫函數模板,則函數模板具有該特定名稱的函數必須在呼叫範圍內可見,ADL 才能成功。
  • 在某些情況下,使用宣告可以使函數範本可見,從而允許 ADL 找到它。

以上是為什麼在 C 中參數依賴查找無法找到具有顯式模板參數的函數模板?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn