2010-08-07 55 views
7

不C++標準保證以下?:C++標準,重載函數解析/匹配

template<typename T> 
void function(T (&)[1]); 

template<typename T> 
void function(T*); 

int a[1]; 
function(a); // first function gets called, not second version 
+0

我也想知道。 – zneak 2010-08-07 19:19:52

+2

好問題,但問題的主題不是那麼多。你認爲你可以使它更相關,比如「對於C++模板中的數組,參數類型T(&)[1]是否比T *更好匹配」。順便說一句,我不確定它是否與超載有關。 – 2010-08-07 19:26:02

+0

@Mac我稍微改變了主題,是否更好? – Anycorn 2010-08-07 19:28:37

回答

6

是的,這是有保證的,但原因是比GMAN說不同。將選擇「長度爲1的數組」過載,因爲它比模板函數偏序中的第二個更專門化。基本上,這意味着T(&)[1]形式的參數將始終與T*形式中的第二個模板參數相匹配,因此當轉換序列不確定時,將始終選擇第一個重載。

從13.3.3:

根據這些定義,一個可行的 功能F1被定義爲比另一種可行的功能 F2更好 功能如果所有的參數我,ICSI(F1)是 不是更壞轉換序列比 ICSI(F2),然後

  • 對於一些參數Ĵ,ICSj(F1)大於 ICSj更好的轉換序列(F2),或者,如果不是,

  • F1是一個非模板函數和F2是一個模板函數專業化, 或者,如果不是,

  • F1和F2是模板函數,並且該函數模板F1是 比透射電鏡板 更專門爲F2根據14.5.5.2, 描述的局部 排序規則,或者,如果不是,

...

正常功能只受第一項影響;當任何模板函數都在候選函數集合中時,第二個或第三個項目可以決定。我們想要這樣做的原因是我們希望能夠編寫看起來模糊的模板化重載。例如。

template <class T> void f(T); 
template <class T> void f(T*); 

否則會模糊int*。在C++ 0x中,你甚至可以寫出如下的聲明:

template <class ...Ts>   void f(const Ts&... args); 
template <class T, class ... Ts> void f(const T& a, const Ts&... args); 

並且每當至少有一個參數時將選擇第二個。

+0

從我的已刪除答案@aaa:@jpa那麼,模板的存在是什麼造成了很大的差異? – GManNickG 2010-08-07 19:56:12

+0

@GMan:是的,請參閱編輯。 – jpalecek 2010-08-07 20:04:59