2017-08-08 165 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。 –