簡體   English   中英

為什么此模板參數推導/重載解析失敗?

[英]Why does this template argument deduction/overload resolution fail?

此代碼段無法在MSVCClangGcc中編譯(它們提供不同的錯誤消息):

int foo(int a, int b) {
    return a + b;
}

template <class Ret, class A, class B>
void foo(Ret (*)(A, B)) {

}

int main() {
    foo(foo);
    return 0;
}

這不應該編譯嗎? 我無法理解為什么它無法解析重載函數或推斷模板參數。 歡迎任何幫助,謝謝。

PS:如果模板被替換為void foo(int (*)(int, int)) ,或者我們重命名foo以避免重載,則編譯它。

為簡單起見,讓我們調用第一個重載foo1並調用第二個重載foo2

使用模板,問題是你不能根據[temp.deduct.call] / 6推斷出外部foo的模板參數:

如果參數是包含一個或多個函數模板的重載集,則該參數將被視為非推導的上下文。

沒有模板,程序會考慮所有可能性foo1(foo1)foo1(foo2)foo2(foo1)foo2(foo2)並根據[over.over] / 6選擇唯一可行的foo2(foo1)

[ 注意:如果f()g()都是重載函數,則必須考慮可能性的叉積來解析f(&g)或等價表達式f(g) - 結束說明 ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM