2012-11-06 87 views
2

什麼在下面是根據標準合式:推導出模板參數的順序?

// 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的情況下,如果從變量和函數內部傳遞的類型是不同的,這類型將作爲選:在函數之一,還是變量之一?

+0

定義「好」。形式良好_and_定義明確_而不是未指定? –

+0

'如果從變量和函數內部傳入的類型不同'它們不是。永遠。如果你試圖讓他們這樣做,那麼你傳遞不正確的參數,你的編譯將失敗。 –

+0

你缺少特質背後的':: value'。 – jrok

回答

5

(2)格式不正確,因爲T在聲明前用於默認模板參數T1。其餘的都是格式良好的。 (3)和(4)中,如果T必須從函數參數中推導出來,那麼T必須在它使用的每個地方被推導爲相同類型。也就是說,如果從第一個函數參數中的使用推斷出它是一種類型,並將其推斷爲與其在第二個函數參數中使用的不同類型,那麼推導失敗並且使用不合格。

在(5),爲T1默認參數將永遠不會被使用 - 當使用專業化任一實際參數會被指定,或模板參數將從函數參數x推斷出來。

(6)沒有什麼特別的地方:如果所有的模板參數都是從函數參數中推導出來的,那麼聲明模板參數的順序是不相關的。

+0

同樣在(4) - (3)中。 – ecatmur

+0

我已更正::值問題並添加了第六種情況 – Vincent