[英]Deduced template parameter order?
根據標准,以下內容格式正確:
// 1 : Deduced template parameter in the normal order
template<typename T, typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type>
void f(T x);
// 2 : Deduced template parameter in the inverted order
template<typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type, typename T>
void f(T x);
// 3 : Deduced template parameter before a function pointer
template<typename T>
void f(T x, void(*g)(int, int, T*));
// 4 : Deduced template parameter after a function pointer
template<typename T>
void f(void(*g)(int, int, T*), T x);
// 5 : Deduced template parameter with inversed variables
template<typename T, typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type>
void f(T1 x, T y);
// 6 : Inverted deduced parameter
template<typename T, typename T1>
void f(T1 x, T y);
在3和4的情況下,如果從變量和函數內部傳遞的類型不同,則將選擇哪種類型:函數之一還是變量之一?
(2)格式錯誤,因為T1
在聲明之前在默認模板參數中使用T
其余的格式良好。
在(3)和(4)中,如果T
必須從函數參數來推斷,然后T
必須推導在於它用於在每個地方相同的類型。 即,如果根據其在第一函數參數中的使用推論為一種類型,並且推導為與其在第二功能參數中的用法不同的類型,則推論將失敗並且該用法格式不正確。
在(5)中,將永遠不會使用T1
的默認參數-使用特殊化時將指定實際參數,或者將從函數參數x
推導出模板參數。
關於(6),沒有什么特別的:如果所有的模板參數都是從函數參數中推導出來的,那么聲明模板參數的順序就無關緊要了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.