2017-08-08 201 views
0

這是由C一個鍛鍊++入門第5版:模板函數參數扣

template<typename T> 
void f1(T, T){} 
int i = 0, *p1 = &i; 
const int *cp1 = &i; 

f1(p1, cp1); 

但是編譯器會產生一個錯誤:爲什麼錯誤包括點參考

no matching function for call to 'f1(int*&, const int*&)' 

我不知道?我認爲參數推導是'f1(int *,const int *)'。

回答

3

這就是GCC表明參數是一個左值的方式。如果它表示參數類型爲T&,則表示該參數的類型爲T並且是一個左值。如果它說參數類型是T(非參考),則表示該參數的類型爲T並且是一個右值。

+0

只有當**參數類型是* universal reference *時才適用**規則**嗎? –

+0

@DeanSeo我認爲你不理解。我的答案與模板論證扣除無關。這只是關於GCC如何選擇在診斷消息中顯示某些信息。 – Brian

+0

對不起。是的,我再讀一遍,你是對的。 :) +1。 –