8

如何專用具有參數參數的可變參數模板函數?具有const引用的可變參數模板特化

實施例:

template<typename T, typename... Args> 
T foo(Args... args) = delete; 

template<> int foo(int a, const char* str, const Test& t) { .... } // Fails to compile 
//template<> int foo(int a, const char* str, Test) { .... } // Ok 

int main() { 

    auto i = foo<int>(10, "test string!", t); 
    return 0; 
} 

當調用與聲明const Test&參數函數foo時,編譯器沒有看到專門功能和回退,以刪除功能:

error: use of deleted function ‘T foo(Args ...) [with T = int; Args = {int, const char*, Test}]’ 
    auto i = foo<int>(10, "test string!", t); 




以上代碼編譯很好,如果我從參數中刪除const引用。我究竟做錯了什麼?

的代碼可以發現here

回答

3

模板自動扣除不夠聰明猜測,你想讓它的最後一個模板參數設置爲const Test&而不是Test。更確切地說,類型扣除總是從類型中移除cv限定符。

您新的顯式模板實例這裏:

auto i = foo<int, int, const char *, const Test&>(10, "test string!", t); 
+0

當然,我完全忘了顯式實例。感謝您的回答! – Bected

7

這是因爲主模板推斷你的電話模板參數是intconst char*Test,不const Test&。這意味着您的專業化不被使用,因爲模板參數與參數不匹配。

你最簡單的選擇是提供一個單獨的過載,而不是專業化:

template <typename T> 
T foo(int a, const char* str, const Test& t) { /*...*/; } 

Live demo

相關問題