模板實參推斷過程中允許對函數實參進行的兩種類型轉換: (1) const 轉換:可以將一個非const對象的引用(或指針)傳遞給一個const的引用(或指針)形參。 (2)數組或函數指針轉換:如果函數形參不是引用類型,則可以對數組或函數類型的實參應用正常的指針轉換。一個數組實參可以轉換為一個指向其首元素的指針。類似的,一個函數實參可以轉換為一個函數類型的指針。

函數模板可以由用普通類型定義的參數。

指定顯式模板實參:
//編譯器無法推斷T1,它未出現在函數參數列表中template <typename T1, typename T2, typename T3>T1 sum(T2,T3);//T1是顯式指定的,T2和T3是函數實參類型推斷的。auto val3=sum<long long>(i, lng);//long long sum(int,long)尾置返回類型與類型轉換:

為了獲得元素類型,我們可以使用標準庫的類型轉換模板。

例子:

當參數是一個函數模板實例的地址時,程序上下文必須滿足:對每個模板參數,能唯一確定其類型或值。


從左值引用函數參數推斷類型:
當一個函數參數是模板類型參數的一個普通(左值)引用時,綁定規則告訴我們,只能傳遞給它一個左值。實參可以是const類型,也可以不是。如果實參是const,則T被推斷成const類型.

如果一個函數參數的類型是const T&,正常的綁定規則告訴我們可以傳遞它任何類型的實參–一個對象,一個臨時對象或是一個字面常量值。當函數參數本身是const時,T的類型推斷的結果不會是一個const類型。const已經是函數參數類型的一部分:因此,它不會也是模板參數類型的一部分。

從右值引用函數參數推斷類型:
當一個函數參數是一個右值引用時,正常綁定規則告訴我們可以傳遞給它一個右值。推斷出的T的類型是該右值實參的類型:
template <typename T> void f3(T&&);f3(42);//實參是一個int類型的右值;模板參數T是intc++語言正常綁定兩個例外規則: (1)當我們將一個左值(i)傳遞給函數的右值引用參數,且此右值引用指向模板類型參數(T&&),編譯器推斷模板類型參數為實參的左值引用類型。 (2)如果我們直接創建一個引用的引用,則這些引用形成了“折疊”。在所有情況下(除了一個例外),引用會折疊成一個普通的左值引用類型。在新標準中,折疊規則則擴展到右值引用。只有一種特殊情況會折疊成右值引用:右值引用的右值引用。即
(1)X& &,X& &&和X&& &都折疊成類型X& (2)類型X&& &&折疊成X&&
新聞熱點
疑難解答