我正在尝试深刻理解模板参数推导。
我不明白的一点是,我应该如何应用标准中的规则
here用于类型A
和P
对于以下情况(可悲的是cppreference.com上没有任何示例,请参阅下面的相关部分)
template<typename T>
void foo(T t);
void call_with_reference(int& r) {
foo(r)
}
P
不是reference typ:P := T
A := int&
->匹配P
和A
,得出:T
推导为int&
这显然是错误的。该标准中删除{em {1}}的引用的规则在哪里?一个无混淆,明确的明确答案将不胜感激。
答案 0 :(得分:4)
A
是表达式的类型。表达式类型由[expr.type]/1描述:
如果表达式最初的类型为“对T的引用”([dcl.ref],[dcl.init.ref]),则将该类型调整为T。
所以这里A
是int
。
该表达式是lvalue
,但由于P
不是引用,因此不会发挥任何作用。